空の行をその下の行にどのように変更できますか?

空の行をその下の行にどのように変更できますか?

ファイルを解析しましたが、いくつかの問題があります。クイック修正は空の行をその下の行に置き換えることです。それではどうすればいいですか?

次のファイルのように

apple

banana
big
sig

cake

に変換しなければならない

apple
banana
banana
big
sig
cake
cake

答え1

そしてsed

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

/./! action以下を実行する行に対してアクションを実行します(nここで追加の行を検索してp印刷します)。いいえ( !) には、任意の単一文字が含まれます (.は、任意の単一文字に一致する正規表現演算子です)。

一部の実装には、ファイルをその場で編集するオプションもsedあります。-i-i ''

答え2

これにはawkその機能を使用できます。getline()このコマンドは、テキストファイルから空白行を選択することで機能します!NF。つまり、これは空の行を意味します(行内のフィールド数は0です)。このgetline()関数を使用すると、空の行の即時行であり、変数に保存されますnxt

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

その後、一部は変数、埋め込み改行(ANDで文字列を連結)、変数を再結合して行を{..}構築します。呼び出しはデフォルトで行ポインタを1レベル向上させるので、ORS2番目の追加が必要です。getline()バラより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 == 0NF == 0

答え4

次のようにこれを行うことができます。

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

関連情報