空白行を見つけて、空白行の後に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