私が読んでいる内容は範囲アドレス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
この動作の説明は以下にあります。sed
POSIX仕様:
2つのアドレスを持つ編集コマンドは、最初のアドレスと一致する最初のパターンスペースから2番目のアドレスと一致する次のパターンスペースまで、包含範囲を選択する必要があります。 [...]選択した範囲の後の最初の行から始めて、sed最初のアドレスが再検索されます。その後、このプロセスを繰り返す必要があります。
範囲を見つけると、次の範囲はその行でのみ開始できます。次のような最速範囲。
言い換えれば、範囲内の終了マッチングは一致する行を「消費」する。その行は同じ範囲内の他のインスタンスを起動できません。