我知道如何使用 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