sedを使用して、最後のパターンの発生と空白行の間のテキストを印刷したいと思います。たとえば、次のファイルから:
$ cat file
pattern
1
2
3
pattern
4
5
pattern
6
7
8
9
10
11
ただ印刷したい
6
7
8
9
私sed '/pattern/{:1;$!{/^$/!{N;b1};h}};${x;p};d' file
から試してみるここしかし、うまくいきません。
編集:これはほとんど動作します:
$ sed -n -e '/pattern/ {n; :a; $!{/\n$/!{N;ba};h} }; $ { x;p }' file
6
7
8
9
最後に空白行を削除する方法は?
Edit2:これはうまくいく解決策です。
$sed '/pattern/{:1;$!{/\n$/!{N;b1};h}};${x;s/pattern\n//;s/\n$//;p};d' file
6
7
8
9
Edit3: これは良いです:
$sed '/pattern/{:1;$!{/\n$/!{N;b1};s///;h}};${x;s/pattern\n//;p};d' file
ベストアンサー1
ストリームエディタを使用してsed
パターンレコードを検出し、そこから行をスキップし、次の空行が見つかるまで繰り返します。それまではパターン空間のレコードが蓄積され、ループ後はホールド空間の内容をパターン空間の内容で上書きします。これはすべてのパターン...空のラインブロックに対して再び発生します。ファイルの末尾で保留内容を検索し、空でない場合は印刷します。
$ sed -ne '
/pattern/{
$d;n
:loop
s/\n$//;tdone
$bdone;N
bloop
:done
x
}
${x;/./p;}
' file
6
7
8
9
最大。ラインエディタはこの範囲のような問題に自然に適しています。編集する
ed -s file <<\eof
a
.
?pattern?+1;/^$/-1p
Q
eof
GNU sedエディタを使用する別の方法は、範囲演算子を使用して予約済みスペースのブロックを収集することです。
sed -e '
/pattern/,/^$/!ba
/./!ba
H;/pattern/{z;x;}
:a
$!d;x;s/.//
' file
私たちはSlurpモードでGNU sedエディタを使用することができ、パターンの最後のインスタンスに到達するために正規表現の欲張りな特性を使用できます。
sed -Ez '
s/.*pattern\n(([^\n]+\n)+)(\n.*)?/\1/
' file
以下はPerlの範囲演算子に対応するsedです。 Array@Aはブロックラインの集水ゾーンとして機能します。
perl -ne 'next unless
my $e = /pattern/ .. /^$/;
@A = $e == 1 ? ()
: /./ ? (@A, $_)
: @A;
}{print @A;
' file