【发布时间】:2012-05-21 13:53:33
【问题描述】:
我正在编写脚本来搜索与某种模式匹配的行。我必须为这个脚本使用 sed。 这适用于搜索和打印匹配的行:
sed -n /PATTERN/p
但是,我还想在行本身的前面打印匹配的行号。 如何使用 sed 做到这一点?
【问题讨论】:
-
您希望它们连续编号还是基于文件中的行号?
我正在编写脚本来搜索与某种模式匹配的行。我必须为这个脚本使用 sed。 这适用于搜索和打印匹配的行:
sed -n /PATTERN/p
但是,我还想在行本身的前面打印匹配的行号。 如何使用 sed 做到这一点?
【问题讨论】:
切换到 awk。
BEGIN {
ln=0
}
$0 ~ m {
ln+=1
print ln " " $0
next
}
{
print $0
}
...
awk -f script.awk -v m='<regex>' < input.txt
【讨论】:
= 用于打印行号。
sed -n /PATTERN/{=;p;}
【讨论】:
sed -n "/$pattern/{=;p;}" "$FILE"
你可以使用grep:
grep -n pattern file
如果您在sed 中使用=,则行号将打印在单独的行上,并且无法在模式空间中进行操作。但是,您可以将输出通过管道传输到另一个 sed 实例中,以合并行号及其适用的行。
sed -n '/pattern/{=;p}' file | sed '{N;s/\n/ /}'
【讨论】:
使用 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
【讨论】:
对于 sed,使用以下获取行号
sed -n /PATTERN/=
【讨论】:
这是最简单的方法:
awk '{print ln++ ": " $0 }'
【讨论】: