2

我觉得好像这个问题以前一定有人问过,但我根本找不到类似的问题。

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

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

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

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

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

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

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

4

3 回答 3

3

使用 awk:

awk '!/^ /&&/:$/{p=0}p;/^Header 2:$/{p=1}' file

它是如何工作的:

  • 这个块!/^ /&&/:$/{p=0}的意思是:如果你发现一行不是以空格开头并以冒号“:”结尾,那么将标志p设置为零
  • 该块p;表示:如果标志具有非零值,则打印当前行
  • 此块/^Header 2:$/{p=1}表示:如果找到匹配的行Header 2,则将标志设置 p1

这是可行的,因为未初始化的变量的值为零。

于 2013-08-27T15:17:45.297 回答
2
awk 'f&&/^ /{print; next} {f=/^Header 2:/}' file
于 2013-08-27T18:56:38.280 回答
2

或与sed

sed -n '/Header 2:/,/Header/{/Header/!p}' file
于 2013-08-27T17:48:16.537 回答