sed: 最後のパターン発生で終わる範囲があります(貪欲範囲)。

sed: 最後のパターン発生で終わる範囲があります(貪欲範囲)。

次のファイルをインポートします。

$ cat f1
stu vwx yza
uvw xyz abc
abc def ghi
def ghi jkl
ghi jkl mno
jkl mno pqr
mno pqr stu
pqr stu vwx
stu vwx yza

最初の行から始めて、以下を含むabcすべての行を印刷します。最初mnoGNUが含まれますsed

$ sed -n '/abc/,/mno/p' f1
uvw xyz abc
abc def ghi
def ghi jkl
ghi jkl mno

次回まですべての行を印刷するにはどうすればよいですか?最後のものContains mno、たとえば、次の結果をどのように取得できますか?

uvw xyz abc
abc def ghi
def ghi jkl
ghi jkl mno
jkl mno pqr
mno pqr stu

つまり、GNUsedの範囲選択を貪欲にする方法はありますか?

修正する

私の設定では:

  • 欠落している場合は、mnoファイルの最後まですべての内容を印刷する必要があります。
  • mno最初の以前は発生できませんabc
  • 常に1つ以上があり、同じ行には決してありませんabcabcmno

編集するstu vwx yzaファイルを含む行で始まらないように、最初にダミー行を追加しました。 (abc最初の行から始まるソリューションを避けるために、ファイルは含まれているabc最初の行から始める必要があります。)

ベストアンサー1

sed '/abc/,$!d;0,/mno/b;:1;/mno/b;$d;N;b1' file

動作アルゴリズム:
2つのアドレス範囲を使用します。
最初は、/abc/,$!d;最初のパターンマッチングの前にすべてを削除します。
2番目は、0,/mno/b;パターンが一致するまで各ラインバッファ(パターンスペース)を送信し、残りのスクリプトの/mno/出力をバイパスし、パターンがファイルに見つからない場合は削除を防ぎます。
残りのスクリプトは:1;/mno/b;$d;N;b1ループで動作します。エディタバッファでは、パターンマッチが発生するまで行が追加されます。パターンが見つかると、/mno/スクリプトの残りの部分をバイパスし、バッファ全体が出力に送信されます。一致するものがない場合は、バッファの最後の行を削除します。

おすすめ記事