打印 match1 之前的 n 行以及 match1 之后直到 match2 的行

打印 match1 之前的 n 行以及 match1 之后直到 match2 的行

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

尝试将命令的输出通过管道传输grepsed命令吗?例如,

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

相关内容