-1

我如何在 pattern1 和 pattern2 之间打印线条,但我不需要 pattern1 和 pattern3 之间的线条。

请在 sed、awk 中提出解决方案。

我有这样的情况。

pattern1
blah blah blah
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern3
pattern1
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah 
blah blah blah
pattern3

期望输出:

pattern1
blah blah blah
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern2
4

4 回答 4

5

使用 sed:

sed -n '/pattern1/{:l N;/pattern3/b;/pattern2/!bl;p}' input

描述

/pattern1/{   # Match pattern1 and ...
:l N;         # start loop and read a line
/pattern3/b   # quit if pattern3 matches
/pattern2/!bl # loop until pattern2 matches
 p            # print all lines

输出

pattern1
blah blah blah
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern2
于 2013-04-22T20:17:25.157 回答
3

一种方法:

$ awk '/pattern1/{s=1;f=1;s=NR}f{p[NR]=$0}/pattern3/{s=0}/pattern2/&&s{f=0;for(i=s;i<=NR;i++)print p[i]}' file
pattern1
blah blah blah
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern2
于 2013-04-22T18:46:43.997 回答
2
$ awk '/pattern1/{f=!f;buf=""} f{buf = buf $0 ORS} /pattern2/{if(f)printf "%s",buf; f=0} /pattern3/{f=0}' file
pattern1
blah blah blah
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern2

为了可能有助于理解,以下是上面的几行内容和更冗长的变量名称:

awk '
/pattern1/ {
    found=!found
    buffer=""
}

found {
    buffer = buffer $0 ORS
}

/pattern2/ {
    if (found) {
        printf "%s",buffer
    }
    found=0
}

/pattern3/ {
    found=0
}
' file
于 2013-04-22T19:24:43.557 回答
1

在纯 sed 解决方案中,我迷失在我的持有空间中;所以这是一个替代方案

$ tac input | sed '/pattern3/,/pattern1/d' | tac
pattern1
blah blah blah
blah blah blah
blah blah blah
pattern2
pattern1
blah blah blah
blah blah blah
pattern2
于 2013-04-22T18:46:09.780 回答