範囲内で一致するテキストを含む行を印刷してみてください。 --START-- と --END-- をレンジモードで使用すると正常に動作します。
$ sed -n '/--START--/{:a;N;/--END--/!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
--END--
--START--
Device=A
Data=asdfasdf
--END--
ただし、 --END-- を空行に置き換えると動作が停止します。
file:
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
--START--
Device=A
Data=asdfasdf
$ sed -n '/--START--/{:a;N;/^$/!ba; /Device=A/p}' file
sed が中かっこ内の空行パターンを認識しないようです。 --END-- 代わりに空行モードを使用するようにコマンドを変更する方法を教えてください。
答え1
ここでの問題は、中かっこサブ式にあるかどうかにかかわらず、/pattern/
全体のパターン空間と一致することです。複数行のパターンがある場合(N
例:を使用して)、一致することは不可能です(および^$
間に1つ以上の改行文字を使用)。^
$
GNU sedでは中サイズウルトララインモード拡張
^と$がそれぞれ改行の後の空の文字列と改行の前の空の文字列と一致するようにします(通常の動作に加えて)。
$ sed -n '/--START--/{:a;N;/^$/M!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum
それ以外の場合は、複数行のパターンに続く空行を一致させるには、\n$
明示的にexを使用できる必要があります。
$ sed -n '/--START--/{:a;N;/\n$/!ba; /Device=A/p}' file
--START--
Device=A
Data=asdfasdf
Lorem=Ipsum