切是工作意外?

dan*_*bst 1 bash cut

我想用自定义分隔符将一行划分为字段:

echo "field1   field2    field3" | cut -d\  -f2
Run Code Online (Sandbox Code Playgroud)

我期望field2在结果中显示,但我什么都没得到.我该如何拆分cut

Mar*_*oij 6

问题是,有多个空间.cut(1)不会破坏分隔符.它将在遇到的第一个分隔符上拆分.

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

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

解决方案:

  1. 如果您使用的是FreeBSD,请使用-w; 这将在空格上分割(虽然非常有用,但这是非标准的;并且不能移植到GNU剪切)
  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