0

エンドラインが 2 つの等号を分割しているファイル内のすべての行のエンドラインを削除しようとしています

すなわち:

1
a=
=b
2

1
a==b
2

私は持っている

sed -i.bak -e 's/=\n    =//g' fileName

ただし、ファイルに変更を加えていないようです。私のスクリプトは正しいですか?

4

3 に答える 3

2

これはうまくいくかもしれません(GNU sed):

sed '$!N;s/=\n=/==/;P;D' file

また

sed -e '$!N' -e 's/='$"\n"'=/==/' -e 'P' -e 'D' file
于 2012-12-17T20:47:23.773 に答える
2

これを試して。ファイルの内容全体をパターン空間に保存し、等号の間のすべての改行文字を削除します。

sed -i.bak -e ':a ; $! { N; b a }; s/=\n=/==/g' fileName

次の結果が得られます。

1
a==b
2
于 2012-12-17T20:04:14.293 に答える
1

異なる OS の異なる sed は、異なる方法で改行を扱います。sed で改行を指定する最も移植性の高い方法は、リターンの前にバックスラッシュを使用することです。

sed -e 's/=\
=//g' file

しかし、他の魔法のsed文字を呼び出して複数の行をバッファなどに丸呑みするまで、それはうまくいきません....

awkを使用するだけです:

$ cat file
1
a=
=b
2
$ awk '{printf "%s%s", $0, (/=$/ ? "" : "\n")}' file
1
a==b
2

現在の行が「=」または改行で終わっている場合は、現在の行を表示し、その後に何も表示しません。これ以上にシンプルで、移植性が高い....

ああ、元のファイルを変更したい場合は、次のようにします。

awk '{printf "%s%s", $0, (/=$/ ? "" : "\n")}' file > tmp && mv tmp file
于 2012-12-19T13:50:28.980 に答える