所以我知道如何将线条从一种模式打印到另一种模式:
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_1
到pattern_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
提交。
答案 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
是用户定义的)。