Unixシェルスクリプトで空白行の後に前の行に次の行を追加する方法

Unixシェルスクリプトで空白行の後に前の行に次の行を追加する方法

以下のUnixファイルがあります

abcdge
efg
bh

ggh
bhj
mkl

ファイルを変更して次のように設定したいと思います。

abcdge
efg
bhggh
bhj
mkl

意味: 各空行の後に、次の行を前の行に追加する必要があります。どのように実装できますか?

答え1

$ sed -e '
    $!N;$q;N
    s/\n\n//
    P;D
 ' file

パターンスペースに3行を保持し、連続した改行文字が表示されたら削除します。

答え2

これは、awkを使用するすべてのUNIXシステムのすべてのシェルで機能します。

$ awk '1;END{print"\n"}' RS= ORS= file
abcdge
efg
bhggh
bhj
mkl

答え3

私があなたを理解すれば、おそらくこれがあなたが探しているものでしょう。

sed -z 's/\n\n//g' file

出力:

abcdge
efg
bhggh
bhj
mkl

答え4

<file awk '
   {
   if (n && $0!="")
      printf "\n"
   if ($0=="")
      n=""
   else
      {n=1; p=1; printf "%s", $0;}
   }
   END {if (p) printf "\n"}
 '

空でない各行は、終了改行文字なしで印刷されます。以前は、現在行が空でなく前の行も空でない場合は改行文字が印刷されていたため、この場合は前の行が完成しました。

最後に、空白以外の行が印刷されると、改行文字は最後の不完全な行を終了してそれを完了します。

nそして、pそれぞれ「最後の空ではない行」と「何かが印刷された」を表すマーカーです。

連続した空行は1つの空行と同じです。この行動があなたが望むものかどうかはわかりません。

ソリューションはフィルタ(パイプなど)でうまく機能する必要があります。入力ファイルの変更に必要な場合は、次の点を確認してください。変更内容を保存awk

関連情報