【发布时间】:2014-10-02 07:55:09
【问题描述】:
我想用自定义分隔符将一条线切割成字段:
echo "field1 field2 field3" | cut -d\ -f2
我希望field2 会显示在结果中,但我什么也没得到。如何用cut拆分?
【问题讨论】:
-
分隔符是制表符吗?
我想用自定义分隔符将一条线切割成字段:
echo "field1 field2 field3" | cut -d\ -f2
我希望field2 会显示在结果中,但我什么也没得到。如何用cut拆分?
【问题讨论】:
问题是,空间不止一个。 cut(1) 不会折叠分隔符。它将在遇到的第一个分隔符处拆分。
POSIX 有话要说(强调我的):
- -f 列表
根据字段列表剪切,假定在文件中由分隔符分隔(请参阅 -d)。应输出每个选定的字段。 输出字段应由单个出现的字段分隔符分隔。 没有字段分隔符的行应完整传递,除非指定了 -s。选择输入行中不存在的字段应该不会出错。
解决方案:
-w;这将在空白处拆分(虽然非常有用,但这是非标准的;并且不可移植到 GNU cut)-f 4
awk(1):echo "field1 field2 field3" | awk '{print $2}'
tr(1) 将所有空格折叠成一个空格:echo "field1 field2 field3" | tr -s \ | cut -d\ -f2
【讨论】:
awk(正如stackoverflow.com/questions/3005627/bash-nth-word-in-a-string 中所建议的那样),但我很沮丧那里的最佳答案不起作用。
你可以使用awk:
echo "field1 field2 field3" | awk '{print $2}'
field2
因为cut 不能正确处理多个分隔符。
或者使用tr将多个空格先截断为一个:
echo "field1 field2 field3" | tr -s ' ' | cut -d ' ' -f2
field2
【讨论】: