2013-08-27 89 views
2

我覺得好像這個問題以前一定要問過,但我根本找不到類似的問題。在兩個「標題」之間打印文件的一部分

我有一個非常簡單的文件格式:

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

在每端有一個冒號(任意命名的)頭,其次是縮進用空格文本。

例如,我想選取特定標題下的文本,例如, 「標題2」。最明顯的嘗試是grep,但我只能匹配某些行並輸出固定數量的上下文行。我還介紹了使用sed,就像這樣:

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

當然但這打印出一切直到文件的末尾。

編輯:在一個實際的用例中,我不一定知道什麼標題跟在「標題2」,如果有甚至有一個(它可能是文件中的最後一個)。

回答

3

使用awk:

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

它是如何工作:

  • 此塊!/^ /&&/:$/{p=0}意味着:如果你發現不以空格開頭,以冒號結束的行「:」 ,則將標記p設置爲零
  • 該塊p;表示:如果該標記具有非零值,則打印當前行
  • Th是塊/^Header 2:$/{p=1}的意思是:如果找到與Header 2匹配的行,則將標記p設置爲1

這會起作用,因爲未初始化的變量的值爲零。

+0

對不起,我應該'頭2'後提到的頭可能是不確定的或不存在的。所以我不能依靠它的價值。 – nneonneo

+0

@nneonneo那麼你怎麼知道塊的結束時間? – user000001

+0

每個標頭都是縮進的,以冒號結尾,它也可以由EO​​F結束。 – nneonneo

2

或用sed

sed -n '/Header 2:/,/Header/{/Header/!p}' file 
2
awk 'f&&/^ /{print; next} {f=/^Header 2:/}' file 
相關問題