如何在Bash中按制表符分割字符串

3
test1="one  two three   four    five"
echo $test1 | cut -d $'\t' -f2

我有一个由TAB分隔的字符串,我想用cut命令获取第二个单词。 我找到了这个问题:如何在bash中以制表符为分隔符拆分字符串。但是该解决方案没有使用cut命令。
4个回答

6
这是因为在使用echo时需要引用$test1变量:
echo "$test1" | cut -d$'\t' -f2

否则,格式会丢失并将制表符转换为空格:
$ s="hello      bye     ciao"
$ echo "$s"              <--- quoting
hello   bye ciao
$ echo $s                <--- without quotes
hello bye ciao

2
您无需使用 cut 命令,可以避免创建新的进程:
$ test1=$(printf "one\ttwo\three\tfour\tfive")
$ read _ two _ <<< "${test1}"
$ echo "${two}"
two

从OP的代码中,test1="one two three four five"已经足够好地定义了变量,不需要使用printf。此外,在这种情况下,"${test1}中的{}是不必要的。 - fedorqui
这取决于IFS是否正确设置为标签,因此如果您之前将其更改为例如断开换行符,则应再次设置它,即IFS = $'\t' read ... - Andris

0
尝试在不使用任何-d选项的情况下使用cut
echo "$test1" | cut -f2

以下是来自 cut 命令手册的专家摘录:
-d, --delimiter=DELIM
    use DELIM instead of TAB for field delimiter 

实际上我已经尝试过这个,结果也是整个test1字符串。 - biubiubiu
请检查编辑后的帖子。我已经用双引号括起了$test1 - Fazlin
你试过单独使用 echo $test1 吗?我在输出字符串中没有看到制表符... 我宁愿使用 t="one\tthwo\tthree";echo -e $t|cut -f2 或者 t="one\tthwo\tthree";printf $t|cut -f2。再见。 - gboffi
@gboffi,问题在于引号本身。一旦你在echo中不使用它们,格式就会丢失。 - fedorqui
@fedorqui - 抱歉,我没有注意到你的回答。我刚刚测试了我的代码并进行了更新。 - Fazlin

-3
我运行了这个:
test1="one;two;three;four;five"

echo $test1 | cut -d \; -f2

并获得:

two

以及你的例子:

test1="one  two three   four    five"

echo $test1 | cut -d \t -f2

并获取:

wo

希望对你有所帮助。


我认为这是制表符的问题。


1
你将分隔符设置为 't'(转义没有影响)。基于此,第二个字段确实是'wo'。 - Gary_W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接