Text-Processing

從文本文件的兩行之間列印數據(僅當“範圍結束”存在時)

  • July 18, 2018

我需要解析一個文件,並且希望在兩個特定行之間列印一段數據。從“範圍開始”到“範圍結束”,但前提是“範圍結束”存在。

如果源文件是:

[This is the start] of some data 
this is information
this is more information
This is does not contain the ending required

[This is the start] of some other data
this is info I want
this is info I want
[This is the ending I was looking for]

它應該列印:

[This is the start] of some other data
this is info I want
this is info I want
[This is the ending I was looking for]

使用 grep 我已經能夠找到我需要的數據並向上列印,但只能通過固定數量的行。

鑑於數據行數不是恆定的,有沒有一種方法可以使用 grep 或 sed 從最後一行開始查找給定字元串的下一次出現並擷取我想要的特定範圍?

數據段的“範圍開始”應與“範圍開始”和“範圍結束”點之間的任何數據一起列印,“範圍結束”匹配決定是否應列印整個行範圍. 如果範圍(數據段)沒有指定的結尾,則不應列印。如果多個段都有一個端點,則應列印包含端點的所有段。不存在輸入文件的結尾沒有開頭的情況,或多個結尾到單個開頭的情況。

在兩個模式之間(包括)列印行並不能解決我的問題,因為它開始在匹配的第一行列印並一直列印直到找到第一個結束段。我只需要列印包含指定結束語句的段。

使用sed

$ sed -n '/This is the start/{h;d;}; H; /This is the ending/{x;p;}' file
[This is the start] of some other data
this is info I want
this is info I want
[This is the ending I was looking for]

註釋sed腳本:

/This is the start/{    # We have found a start
   h;                  # Overwrite the hold space with it
   d;                  # Delete from pattern space, start next cycle
};

H;                      # Append all other lines to the hold space

/This is the ending/{   # We have found an ending
   x;                  # Swap pattern space with hold space
   p;                  # Print pattern space
};

腳本所做的是將所有行保存到“保持空間”( 中的通用緩衝區sed),但是一旦我們找到“起始行”,我們就會重置該空間。當找到“結束行”時,列印保存的數據。

如果在“開始行”之前找到“結束行”,並且如果找到兩個“結束行”而中間沒有“開始行”,則可能會中斷。


awk與上述程序執行相同過程的程序sed

$ awk '/This is the start/  { hold = $0; next }
                           { hold = hold ORS $0 }
      /This is the ending/ { print hold }' file

(與上面相同的輸出)

引用自:https://unix.stackexchange.com/questions/456843