我觉得好像以前一直问这个问题,但我找不到类似的问题。
我有一个非常简单的文件格式:
Header 1:
<multiline text>
Header 2:
<multiline text>
Header 3:
<multiline text>
其中(任意命名的)标题以冒号结尾,后跟用空格缩进的文本。
例如,我想在特定标题下挑选文字,例如“标题2”。最明显的尝试是grep
,但我只能匹配某些行并输出固定数量的上下文行。我也看过使用sed
,如下所示:
sed -ne '/Header 2:/,$p'
但当然这会打印出文件末尾的所有内容。
编辑:在一个实际的用例中,我不一定知道“Header 2”后面是什么标题,如果有一个标题(它可能是文件中的最后一个)。
答案 0 :(得分:3)
使用awk:
awk '!/^ /&&/:$/{p=0}p;/^Header 2:$/{p=1}' file
它是如何运作的:
!/^ /&&/:$/{p=0}
表示:如果您发现一行不以空格开头并以冒号“:”结尾,则将标志p
设置为零p;
表示:如果标志的值为非零,则打印当前行/^Header 2:$/{p=1}
表示:如果您找到与Header 2
匹配的行,请将标记p
设置为1
。这是有效的,因为未初始化的变量的值为零。
答案 1 :(得分:2)
或sed
sed -n '/Header 2:/,/Header/{/Header/!p}' file
答案 2 :(得分:2)
awk 'f&&/^ /{print; next} {f=/^Header 2:/}' file