次のファイルをインポートします。
$ 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
すべての行を印刷します。最初mno
GNUが含まれます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つ以上があり、同じ行には決してありません
abc
。abc
mno
編集する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/
スクリプトの残りの部分をバイパスし、バッファ全体が出力に送信されます。一致するものがない場合は、バッファの最後の行を削除します。