用额外的行显示所有文件直到匹配

Show all the file up to the match with extra lines

我想打印一个文件的头部直到匹配和匹配之后的一些行。

我知道你可以使用sed '/PATTERN/q' FILE打印文件直到图案。 sed 10q FILE top 打印前 10 行。


从这个文件开始:

lorem
ipsum
dolor
sit
amet
consectetur
adipiscing
elit

如果我的模式是 dolor 并且我还想要 2 行,输出将是:

lorem
ipsum
dolor
sit
amet

这是合并这两个命令的方法吗?


Alos,是否可以对文件末尾执行相同的操作(即在匹配前打印文件尾部的一些行)?

如果我保留第一个文件的模式 amet 和匹配前的两行,输出将是:

dolor
sit
amet
consectetur
adipiscing
elit

来源:https://unix.stackexchange.com/a/11306/117394

找到了 awk 的解决方案:

awk '
{
    if (matched == 0) {
        print;
    } else if (lines > 0) {
        lines--;
        print;
    }
}

/dolor/ {
    matched = 1;
    lines = 2;
}' test

灵感来自:

$ awk '1; /dolor/{c=3} c&&(!--c){exit}' file
lorem
ipsum
dolor
sit
amet

$ tac file | awk '1; /amet/{c=3} c&&(!--c){exit}' | tac
dolor
sit
amet
consectetur
adipiscing
elit

请参阅 了解如何使用 awk 查找围绕正则表达式匹配的行。

使用 gnu sed

模式后还有 2 行

sed '/^dolor/!b;N;N;q' infile

模式前还有 2 行

sed 'N;:A;N;/\namet/!{s/[^\n]*\n//;bA };:B;N;bB' infile