![打印 match1 之前的 n 行以及 match1 之后直到 match2 的行](https://linux22.com/image/102778/%E6%89%93%E5%8D%B0%20match1%20%E4%B9%8B%E5%89%8D%E7%9A%84%20n%20%E8%A1%8C%E4%BB%A5%E5%8F%8A%20match1%20%E4%B9%8B%E5%90%8E%E7%9B%B4%E5%88%B0%20match2%20%E7%9A%84%E8%A1%8C.png)
我知道如何使用 grep -B n -A m match 在匹配之前和之后打印 n 和 m 行。我还知道如何使用 sed 打印从 match1 到 match2 的内容。但我怎样才能将这些组合成一行:
> cat file.txt
bar
foo
bar
baz
match1
qux
blah
bleep
match2
boop
blah
n=2 的输出示例:
bar
baz
match1
qux
blah
bleep
match2
答案1
对命令进行分组,这样它们共享相同的输入,因此当grep
退出sed
接管时:
{ grep -B2 -m1 match1; sed '/match2/q'; } < infile
答案2
尝试将命令的输出通过管道传输grep
到sed
命令吗?例如,
grep <options> file | sed <options>
答案3
sed 是一个流编辑器。因此,如果您想打印之前已经消失的行,则需要将它们保存在缓冲区中以供以后使用。所以我首先在缓冲区 1{N;N} 中保留两行并用 N;D 命令维护
sed -rn '1{:X N;N};
/match1[^\n]*$/{:Y N; /match2[^\n]*$/{p;n;bX}; bY};
N;D' infile