sed スクリプトは、最後のパターン発生と空行の間に行を印刷します。

sed スクリプトは、最後のパターン発生と空行の間に行を印刷します。

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

おすすめ記事