Linux

了解 GNU sed 範圍地址的工作原理

  • December 21, 2021

我正在閱讀GNU sed 中的範圍地址。但我不明白它到底是如何工作的,我試圖執行sed --debug但輸出太冗長而無法理解。

假設我有以下文件input.txt

===sep1

Aghroum

===sep2
Thirjeen
===sep3
Ya wedi mata ikinikh

===sep4
Ifoullissen
===sep5

當我嘗試如下使用範圍地址時:

sed -n '/=/,/=/{/=\|^$/! p}' input.txt

輸出是:

# it prints non-empty lines from ===sep1 to ==sep2, and from ===sep3 to ==sep4, etc. 
Aghroum
Ya wedi mata ikinikh

據我所知,GNU sed 逐行處理輸入文件,為什麼它也不匹配to之間的範圍地址?(請注意,我不是在問如何獲取這些行,我知道如何使用類似的東西來做到這一點。但我問的是為什麼它不從to開始第二個範圍地址)==sep2``==sep3``sed -n '/===/!p'``===sep2``===sep3

謝謝

此行為在 POSIXsed規範中進行了解釋:

具有兩個地址的編輯命令應選擇從與第一個地址匹配的第一個模式空間到與第二個地址匹配的下一個模式空間的包含範圍。

$$ … $$從所選範圍之後的第一行開始,sed將再次查找第一個地址。此後,應重複該過程。

一旦找到一個範圍,下一個範圍最早只能從該範圍之後的行開始。

換句話說,範圍內的結束匹配“消耗”了它匹配的行;該行無法啟動同一範圍的另一個實例。

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