如果分隔符是多个空格,则使用 cut 时进行分词

如果分隔符是多个空格,则使用 cut 时进行分词

我正在运行 bash 脚本,执行以下操作:

cut -d ' ' -f2 <<< "aaa bbb"

得到结果:

bbb

如果有多个空格作为分隔符(假设是三个):

cut -d ' ' -f2 <<< "aaa   bbb"

结果是:

 bbb

这是在 debian 8 下运行的。

现在,在 debian 10 下运行的相同脚本会产生不同的输出:

如果有多个空格作为分隔符(假设是三个):

cut -d ' ' -f2 <<< "aaa   bbb"

结果是“”,只是一个空格。

我希望在 debian 8 中具有与 debian 10 相同的行为。有什么想法吗?

(我知道,我可以使用 tr -s 并去掉三个空格,但我想了解为什么会有不同的行为)。

最好的问候,佐斯

答案1

cut我认为最近的行为不应该发生这样的改变。我也无法使用 Debian 8.11 和cutGNU coreutils 8.23 重现该情况。

但是,如果您给出cut参数-f 2-,并带有尾随破折号,您将获得从字段 2 开始的所有字段。我认为这与您所描述的非常匹配:

$ cut -d ' ' -f2- <<< "aaa   bbb"
  bbb

请注意,输出中有两个前导空格,它们是字段 2(空)、3(空)和 4 ( bbb) 之间的字段分隔符。你的问题中有一个前导空格,但我不知道这是否是故意的。

答案2

我已经创建了一个补丁向 中添加了新的-m命令行选项cut,该选项在字段模式下工作并将多个连续分隔符视为单个分隔符。这基本上以相当有效的方式解决了OP的问题。几天前我也在上游提交了这个补丁,希望它能合并到 coreutils 项目中。

有一些进一步的想法关于向 中添加更多与空白相关的功能cut,并就所有这些提供一些反馈,那就太好了。我愿意实现更多补丁并向cut上游提交它们,这将使该实用程序在各种现实场景中更加通用和更可用。

相关内容