【shell编程】分割符IFS

分割符IFS

在 Bash 中,IFS(内部字段分隔符)的默认值是一个包含空格、制表符和换行符的字符串。具体来说,默认的 IFS 值为:

  • 空格(
  • 制表符(\t
  • 换行符(\n

这意味着当使用 read 命令或其他处理输入的操作时,Bash 会根据这些字符将输入分割成多个字段。

如果你有一行文本,如:

apple orange banana

使用默认的 IFS,这行文本会被分割为三个字段:appleorangebanana。例如:

IFS=' ' # 这里是默认值,可以省略
read field1 field2 field3 <<< "apple orange banana"
echo "$field1, $field2, $field3"  # 输出: apple, orange, banana

 

 

假设你有一个以逗号分隔的文件,你想读取每一行并分割字段:

#!/bin/bash

# 设置 IFS 为逗号
IFS=','

while read -r field1 field2 field3; do
    echo "字段1: $field1, 字段2: $field2, 字段3: $field3"
done < input.csv

 

IFS=$'\t' 是 bash 中用来将内部字段分隔符(IFS)设置为制表符的语法。这里的 $'\t' 是一种特殊的字符串表示法,用于表示包含控制字符的字符串。在这个例子中,它表示一个制表符字符。

设置 IFS 为制表符

通过将 IFS 设置为制表符,你可以使 Bash 在处理输入时将制表符作为字段的分隔符。这在处理制表符分隔的文本文件(如 TSV 文件)时非常有用。

# 设置 IFS 为制表符
IFS=$'\t'

# 读取 TSV 文件
while read -r field1 field2 field3; do
    echo "字段1: $field1, 字段2: $field2, 字段3: $field3"
done < input.tsv

用法示例

假设 input.tsv 文件的内容是:

name1    value1
name2    value2

输出:

字段1: name1, 字段2: value1, 字段3: 
字段1: name2, 字段2: value2, 字段3:

当使用 IFS=$'\t' 读取时,每行会根据制表符分成两个字段。

 

在 bash 中,设置 IFS(内部字段分隔符)为换行符(\n)的方式有几种,不同的语法表示方式有细微的区别。以下是你提到的几种用法的解释:

  1. IFS='\n':这种方式将 IFS 设置为包含字符 \n 的字符串,而不是换行符本身。它实际上会被视为字面字符串,不会产生换行符效果。

  2. IFS="\n":这也是将 IFS 设置为字面字符串 \n。与第一种方式类似,它不会被解释为换行符,而是将其视为一个包含反斜杠和字母 n 的字符串。

  3. IFS=$"\n":这种用法通常会产生未定义的结果。 $"" 是用于字符串的扩展,但在这个上下文中,它不会将 \n 解释为换行符,效果与前两种方式相同。

  4. IFS=$'\n':这种方式是正确的用法,它使用了 Bash 的 ANSI C 字符串扩展,\n 被解释为实际的换行符。因此,这将正确地将 IFS 设置为换行符,允许在读取输入时以换行符作为分隔符。

  • 推荐使用IFS=$'\n',这是设置 IFS 为换行符的正确方式。
  • 不推荐使用IFS='\n'IFS="\n"IFS=$"\n",因为它们不会产生换行符的效果。

 

在 Bash 中,设置 IFS(内部字段分隔符)为制表符(\t)的方式有几种,各自的效果如下:

  1. IFS='\t':这将 IFS 设置为包含字面字符串 \t 的字符串,而不是制表符。它不会产生预期的分隔效果。

  2. IFS="\t":这同样是将 IFS 设置为字面字符串 \t,不会被解析为制表符,而是被视为包含反斜杠和字母 t 的字符串。

  3. IFS=$"\t":这种用法通常会产生未定义的结果。虽然 $"" 是用于字符串扩展的语法,但在这个上下文中,它不会正确解析为制表符,效果与前两种方式相似。

  4. IFS=$'\t':这是设置 IFS 为实际的制表符的正确方法。使用 Bash 的 ANSI C 字符串扩展,\t 会被解释为制表符,因此这将正确地设置 IFS

总结

  • 推荐使用IFS=$'\t',这是设置 IFS 为制表符的正确方式。
  • 不推荐使用IFS='\t'IFS="\t"IFS=$"\t",因为它们不会产生制表符的效果。

参考资料

posted @ 2021-10-12 22:25  苏格拉底的落泪  阅读(327)  评论(0)    收藏  举报