在模式之后打印行,直到第二次出现不同的模式

时间:2017-07-25 21:54:23

标签: bash sed

所以我知道如何将线条从一种模式打印到另一种模式:

sed -ne '/pattern_1/,/pattern_2/ p'

适用于输入如下:

random_line_1
pattern_1
random_line_2
random_line_3
random_line_4
random_line_5
pattern_2
random_line_6

这样就可以打印从pattern_1pattern_2的行。

但是如何在第二个模式的第二次出现之前打印行:

random_line_1
pattern_1
pattern_2
random_line_3
random_line_4
random_line_5
pattern_2
random_line_6

我想打印从pattern_1第二 pattern_2的行,以便我将其作为输出:

pattern_1
pattern_2
random_line_3
random_line_4
random_line_5
pattern_2

更具体地说,我试图捕获文本,从标题开始,被空行包围,可能在标题之前或之后有文本,也可能在第二空行之后(其中) pattern_1是标题,pattern_2是空行):

Header:
<empty line>
     Some_text
     Some_more_text
     Even_more_text
     When_will_it_stop
<empty line>

最好,sed答案最有效,因为我对它的工作方式有一点了解,但只要解释了每一段命令,我都会接受awk提交。

4 个答案:

答案 0 :(得分:1)

请你试试。

awk '/pattern_1/{a=1}
a<3 && a;
/pattern_2/{a++}
' Input_file

添加代码如下所示。

awk '/pattern_1/{a=1} ##Searching for string /pattern_1/ in a line, if it is present in a line then making variable a value as 1.
a<3 && a; ##Now checking if variable a value is less than 3 and it is NOT NULL, so if both conditions are TRUE then didnot define any action, so by default print action will happen on current line of the Input_file.
/pattern_2/{a++} ##Searching string pattern_2 in a line and incrementing the value of variable a with 1 each time it sees this string in a line.
' Input_file ##mentioning Input_file name over here.

答案 1 :(得分:1)

我不是在要测试的计算机上,但是您应该能够通过grep及其“context”开关({{ 1}},-A-B)。

所以要删除-C之前的所有行,只需找到pattern1以及(pattern1)之后的所有行:

-A

然后,在结果中,搜索grep -A 9999 "pattern1" YourFile 的第二次出现(-m2)和之前的所有内容(pattern2):

-B

答案 2 :(得分:1)

针对您的具体案例的简单示例:

sed -ne '/pattern_1/,/pattern_2/{/pattern_1/N;p}'

这只是说在范围内,将标题pattern_1之后的行吸入模式空间并打印出来。这意味着,如果pattern_1之后的行为pattern_2,那么pattern_2的出现将不计入该范围。

换句话说: sed -ne '/Header/,/^$/{/Header/N;p}'

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed -n '/pattern_1/{:a;N;s/pattern_2/&/2p;Ta}' file

从包含pattern_1的地址收集模式空间中的以下行,直到成功打印pattern_2的第二次替换。

对于您的特定示例,请使用:

sed -n '/Header:/{:a;N;s/\n$/&/mp2;Ta}' file

N.B。 m标志允许在模式空间内的多个行上进行匹配。 T命令与t命令相反,当前一次替换成功时,该命令跳转到位置:x(其中x是用户定义的)。