一致/空白行の後にn行目を印刷する方法

一致/空白行の後にn行目を印刷する方法

空白行を見つけて、空白行の後にn行目を印刷する短いスクリプトを作成しようとしています。

~のため

foo1
foo2
foo3

bar1
bar2
bar3

spam1
spam2
spam3

eggs1
eggs2
eggs3

空白行の後に2行目を印刷すると、次のような結果が得られます。

foo2
bar2
spam2
eggs2

sedを試してみましたが、sed -n -e "/^$/ {N; N; x; N; p; x; d}"予約されたスペースを消去できず、結果は私が望むものとは異なりました。

答え1

awk '++n == 2; !NF {n = 0}' < your-file

または:

sed -n '
  n;p
  :1
  /./{
    n;b1
  }' < your-file

答え2

0行は空行とみなすので少し難しいです。これを無視して「空白行の後に1行ずつ印刷する」という文字通りの意味を取ると、次のようにできますex

ex -sc 'g/^$/+2p' -cq filename
  • -s:自動モード(ex実際に対話型編集)。
  • -c:実行するコマンドを宣言します。
  • g/^$/:次のコマンドを実行してくださいG世界中ですべての空行
  • +2p:現在の行から2行下の行を印刷します。
  • q: 終了コマンド

ex行0を空の行として計算するには(行1が空でない場合にのみ)、行1の前に空の行を挿入してから行1〜2をフィルタリングすると、より洗練されなければなりませんuniq。しかし、今はawk目的を達成するためにを使用する方が良いです。

答え3

簡単に完了perl:

$ perl -n -e 'BEGIN {$count=0}; 
              if (/^\s*$/) {$count=0} else {$count++};
              if ($count eq 2) {print}' alexandru.txt 
foo2
bar2
spam2
eggs2

答え4

空行以降の2行目を印刷する場合、エンコード値は2です。

試してみてください:

awk 'BEGIN { empty=1; n=0; } { if ($0 ~ /^$/) { empty=1; n=0; } else if (empty) { n++; if (n==2) { empty=0; print; } } }' file.txt

file.txtは、現在のディレクトリから解析するファイルの名前です。

n番目の行を検索するときは、すべての空白行の後に常にn個以上の行が続くとします。そうですか?

テスト出力は次のとおりです。

awk 'BEGIN { empty=1; n=0; } { if ($0 ~ /^$/) { empty=1; n=0; } else if (empty) { n++; if (n==2) { empty=0; print; } } }' file.txt
foo2
bar2
spam2
eggs2

----

有名なページがあります:Sed - Bruce Barnettの紹介とチュートリアル

以下でこのバージョンをお試しください。あなたのバージョンに非常に似ています。

sed -n '{
2 {
p
}
/^$/ {n
n
p}}' file.txt

foo2
bar2
spam2
eggs2

関連情報