我有一个 20 行的文件。我想在第 10 行和第 15 行之间搜索一个字符串,并将该字符串与原始文件的行号一起打印出来。
我试过了 sed -n 10,15p file | grep -n "pattern"
上述命令的问题是,输出的第 10sed行将是grep.
因此它不会打印原始文件中的行号。
与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)