19

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

sed -n /PATTERN/p

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

4

6 回答 6

21

您可以使用grep

grep -n pattern file

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

sed -n '/pattern/{=;p}' file | sed '{N;s/\n/ /}'
于 2012-05-14T14:09:28.797 回答
13

=用于打印行号。

sed -n /PATTERN/{=;p;}
于 2012-05-14T03:58:39.297 回答
9

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

sed -n /PATTERN/= 
于 2014-07-30T08:59:33.207 回答
3

切换到 awk。

BEGIN {
  ln=0
}

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

{
  print $0
}

...

awk -f script.awk -v m='<regex>' < input.txt
于 2012-05-14T03:44:45.183 回答
2

使用 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

于 2013-12-13T07:01:59.173 回答
1

这是最简单的方法:

awk '{print ln++  ":  "  $0 }' 
于 2016-10-20T16:07:27.400 回答