使用额外的行

时间:2018-03-30 12:56:12

标签: awk sed grep text-processing

我想在匹配后打印文件的头部和匹配的一些行。

我知道您可以使用sed '/PATTERN/q' FILE打印文件,直到该模式。 sed 10q FILE顶部打印前10行。

从这个文件开始:

lorem
ipsum
dolor
sit
amet
consectetur
adipiscing
elit

如果我的模式为dolor并且我想再增加2行,则输出为:

lorem
ipsum
dolor
sit
amet

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

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

如果我保留带有模式amet的第一个文件和匹配前的2行,则输出将为:

dolor
sit
amet
consectetur
adipiscing
elit

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

3 个答案:

答案 0 :(得分:1)

$ 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

请参阅https://stackoverflow.com/a/17914105/1745001了解如何查找与awk匹配的正则表达式周围的行。

答案 1 :(得分:0)

使用awk找到解决方案:

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

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

灵感来自:https://stackoverflow.com/a/5316718/2893600

答案 2 :(得分:0)

使用gnu sed

模式之后还有2行

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

模式之前还有2行

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