特定行和打印行号之间的模式搜索

Lok*_*esh 3 grep sed

我有一个 20 行的文件。我想在第 10 行和第 15 行之间搜索一个字符串,并将该字符串与原始文件的行号一起打印出来。

我试过了 sed -n 10,15p file | grep -n "pattern"

上述命令的问题是,输出的第 10sed行将是grep.

因此它不会打印原始文件中的行号。

mik*_*erv 5

与sed我一起工作时,我通常发现最容易始终缩小可能的结果。这就是为什么我有时会依赖!否定运算符。删除无趣的输入通常比有针对性地选择有趣的输入更简单 - 至少,这是我对此事的看法。

我发现此方法更符合sed的默认行为 - 即在脚本末尾自动打印模式空间。对于诸如此类的简单事物,它还可以更轻松地生成健壮的脚本 - 一个不依赖于某些实现的语法扩展来操作的脚本(如常见的sed {functions})。

这就是为什么我建议你这样做:

sed '10,15!d;/pattern/!d;=' <input
Run Code Online (Sandbox Code Playgroud)

...首先修剪不在第 10 行和第 15 行范围内的任何行,并从那些保留的行中修剪任何不匹配的行pattern。如果您发现您更希望将行号sed打印在与其匹配行的同一行上,那么paste在这种情况下我可能会查看。也许...

sed '10,15!d;/pattern/!d;=' <input |
paste -sd:\\n -
Run Code Online (Sandbox Code Playgroud)

...它只会交替\n使用:字符或另一个\newline替换输入ewlines。

例如:

seq 150 |
sed '10,50!d;/5/!d;=' |
paste -sd:\\n -
Run Code Online (Sandbox Code Playgroud)

...印刷...

15:15
25:25
35:35
45:45
50:50
Run Code Online (Sandbox Code Playgroud)