GNU sed範囲アドレスの仕組みについて

GNU sed範囲アドレスの仕組みについて

私が読んでいる内容は範囲アドレス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は入力ファイルを1行ずつ処理しますが、なぜそれらのうちの1つが一致しないのですか?範囲アドレス間に==sep2==sep3(行を取得する方法を尋ねるのではなく、そのようなものを使用して実行する方法を知っています。しかし、なぜ2番目の範囲のアドレスから始めないのかを尋ねています。sed -n '/===/!p'===sep2===sep3

ありがとう

ベストアンサー1

この動作の説明は以下にあります。sedPOSIX仕様:

2つのアドレスを持つ編集コマンドは、最初のアドレスと一致する最初のパターンスペースから2番目のアドレスと一致する次のパターンスペースまで、包含範囲を選択する必要があります。 [...]選択した範囲の後の最初の行から始めて、sed最初のアドレスが再検索されます。その後、このプロセスを繰り返す必要があります。

範囲を見つけると、次の範囲はその行でのみ開始できます。次のような最速範囲。

言い換えれば、範囲内の終了マッチングは一致する行を「消費」する。その行は同じ範囲内の他のインスタンスを起動できません。

おすすめ記事