【问题标题】:Numbering lines matching the pattern using sed使用 sed 对与模式匹配的行编号
【发布时间】:2012-05-21 13:53:33
【问题描述】:

我正在编写脚本来搜索与某种模式匹配的行。我必须为这个脚本使用 sed。 这适用于搜索和打印匹配的行:

sed -n /PATTERN/p

但是,我还想在行本身的前面打印匹配的行号。 如何使用 sed 做到这一点?

【问题讨论】:

  • 您希望它们连续编号还是基于文件中的行号?

标签: shell unix sed


【解决方案1】:

切换到 awk。

BEGIN {
  ln=0
}

$0 ~ m {
  ln+=1
  print ln " " $0
  next
}

{
  print $0
}

...

awk -f script.awk -v m='<regex>' < input.txt

【讨论】:

    【解决方案2】:

    = 用于打印行号。

    sed -n /PATTERN/{=;p;}
    

    【讨论】:

    • 我这样做:cat "$FILE" | sed -n /"$pattern"/{=;p;} ,但我得到错误:意外标记 `}' 附近的语法错误
    • @zum:移动你的引号,使它们在脚本之外:sed -n "/$pattern/{=;p;}" "$FILE"
    【解决方案3】:

    你可以使用grep:

    grep -n pattern file
    

    如果您在sed 中使用=,则行号将打印在单独的行上,并且无法在模式空间中进行操作。但是,您可以将输出通过管道传输到另一个 sed 实例中,以合并行号及其适用的行。

    sed -n '/pattern/{=;p}' file | sed '{N;s/\n/ /}'
    

    【讨论】:

      【解决方案4】:

      使用 Perl:

      perl -ne 'print "$.: $_" if /regex/' input.file
      

      $. 包含行号。如果输入文件包含:

      record foo
      bar baz
      record qux
      

      这一行:perl -ne 'print "$.: $_" if /record/' input.file 将打印:

      1: record foo
      3: record qux
      

      或者,如果您只希望总行数与模式匹配,请使用:

      perl -lne '$count++ if /regex/; END { print int $count }' input.file

      【讨论】:

        【解决方案5】:

        对于 sed,使用以下获取行号

        sed -n /PATTERN/= 
        

        【讨论】:

          【解决方案6】:

          这是最简单的方法:

          awk '{print ln++  ":  "  $0 }' 
          

          【讨论】:

            猜你喜欢
            • 2021-05-23
            • 1970-01-01
            • 2015-05-12
            • 1970-01-01
            • 2019-04-30
            • 2013-07-31
            • 1970-01-01
            • 2022-01-12
            • 2014-06-17
            相关资源
            最近更新 更多