【问题标题】:Grep: Repeat Line Number for Multiple MatchesGrep:重复多个匹配的行号
【发布时间】:2015-11-15 15:44:15
【问题描述】:

这是我正在尝试做的一个简单示例。

echo "1234567" | grep -inoE "12|34|56"

上面的命令给出以下输出:

1:12
34 
56

意味着它在第 1 行找到了 3 个匹配项:12、34 和 56。

但是,我希望输出显示每一行的数字:

1:12
1:34
1:56

我正在使用 grep (BSD grep) 2.5.1-FreeBSD

【问题讨论】:

  • 对我来说,它显示了第二种格式。 grep (GNU grep) 2.21.
  • 对不起,我忘了说我在 mac 上,并且使用 BSD grep。我已经更新了问题。
  • 所以最好的解决方案可能是使用 GNU grep :) 否则,将需要使用 awk 进行某种后处理。

标签: macos unix grep


【解决方案1】:

由于您使用的是BSD grep 而不是GNU grep,所以这不起作用。

我建议您将结果通过管道传送到一个小的 awk 进行重新映射:

awk -F: 'NF==2{line=$1} NF==1{$0=line FS $0}1' a

这会将行号存储在line 变量中,并将其添加到“孤立”行的输出中。

如果匹配本身包含一些冒号,则需要进行一些额外的按摩,如果是这种情况,请告诉我们。

测试

$ cat a
1:12
34 
56
$ awk -F: 'NF==2{line=$1} NF==1{$0=line FS $0}1' a
1:12
1:34 
1:56

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2019-04-30
    • 1970-01-01
    • 2013-11-28
    • 2013-10-09
    相关资源
    最近更新 更多