在两个“标题”之间打印文件的一部分

时间:2013-08-27 15:15:04

标签: bash sed

我觉得好像以前一直问这个问题,但我找不到类似的问题。

我有一个非常简单的文件格式:

Header 1:
    <multiline text>
Header 2:
    <multiline text>
Header 3:
    <multiline text>

其中(任意命名的)标题以冒号结尾,后跟用空格缩进的文本。

例如,我想在特定标题下挑选文字,例如“标题2”。最明显的尝试是grep,但我只能匹配某些行并输出固定数量的上下文行。我也看过使用sed,如下所示:

sed -ne '/Header 2:/,$p'

但当然这会打印出文件末尾的所有内容。

编辑:在一个实际的用例中,我不一定知道“Header 2”后面是什么标题,如果有一个标题(它可能是文件中的最后一个)。

3 个答案:

答案 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