空行をその下の行に置き換えるにはどうすればよいでしょうか?

空行をその下の行に置き換えるにはどうすればよいでしょうか?

ファイルを解析しましたが、問題があります。回避策として、空行をその下の行に置き換えるのが簡単な方法です。どうすればいいでしょうか?

次のファイルのように

apple

banana
big
sig

cake

に変換する必要があります

apple
banana
banana
big
sig
cake
cake

答え1

sed

sed -ne '/./!{n;p;}' -e p your-file

/./! actionアクションを実行します(ここではnext行を取得してp出力します)。ない( !) には任意の 1 文字が含まれます (.は任意の 1 文字に一致する正規表現演算子です)。

一部のsed実装では、ファイルをその場で編集するための-iまたはオプションも用意されています。-i ''

答え2

awk関数を使ってこれを行うことができますgetline()。このコマンドはテキストファイル内の空の行!NF、つまり空の行(行内のフィールド数が0)を選択します。getline()関数を使用すると、空行から直近の行を削除し、変数に格納しますnxt

awk '!NF && ((getline nxt) >0){ $0 = nxt ORS nxt }1' file

次に、 内の部分は、{..}変数、埋め込まれた改行( との文字列連結ORS)、および再び変数を結合した行を構築します。 2番目の追加が必要なのは、getline()call がデフォルトで行ポインタを1レベル進めるためです。awk を使用してファイルを永続的に変更するにはどうすればよいでしょうか? (「sed -i」のような「インプレース」編集)ファイルを動的に変更します。

答え3

$ awk '/^$/ { ++r; next } { print; for (i=0; i<r; ++i) print; r=0 }' file
apple
banana
banana
big
sig
cake
cake

または

awk '/^$/ { ++r; next } { print; while (r > 0) { print; --r } }' file

同じ出力が得られます。

これは各行を 1 回印刷し、さらにその上の空白行の数に対応する回数印刷します。空白行は変数 でカウントされますr

空白行は正規表現 で検出されます^$。ただし、length == 0または を使用することもできますNF == 0

答え4

次のように実行できます。

$ sed -e ' /^$/{$!N' -e '}' -e 's/\n//p' inp

関連情報