切是工作意外?

时间:2014-08-08 18:42:26

标签: bash cut

我想在自定义分隔符的字段中剪切一行:

echo "field1   field2    field3" | cut -d\  -f2

我希望field2显示在结果中,但我什么都没得到。如何将其与cut分开?

2 个答案:

答案 0 :(得分:6)

问题是,有多个空间。 cut(1)不会使分隔符崩溃。它会在遇到的第一个分隔符上拆分。

POSIX对此有所说明(强调我的):

  
      
  • -f 列表
      根据字段列表进行剪切,假定在文件中用分隔符分隔(请参阅-d)。应输出每个选定的字段。 输出字段应由一个字段分隔符字符分隔。除非指定了-s,否则没有字段分隔符的行应完整传递。选择输入行中不存在的字段不应该是错误。
  •   

解决方案:

  1. 如果您使用的是FreeBSD,请使用-w;这将在空格上分割(虽然非常有用,但这是非标准的;并且可移植到GNU cut)
  2. 使用-f 4
  3. 使用awk(1)echo "field1 field2 field3" | awk '{print $2}'
  4. 使用tr(1)将所有空格折叠到一个空格:echo "field1 field2 field3" | tr -s \ | cut -d\ -f2

答案 1 :(得分:1)

您可以使用awk

echo "field1   field2    field3" | awk '{print $2}'
field2

因为cut无法正确处理多个分隔符。

或者使用tr先将多个空格截断为一个:

echo "field1   field2    field3" | tr -s ' ' | cut -d ' ' -f2
field2