web-dev-qa-db-ja.com

バックスラッシュと改行シーケンスを削除します

Linuxには、レコードごとに1行を含むファイルがありますが、その行にいくつかの改行文字が含まれていると問題が発生します。この場合、バックスラッシュは行の終わりに追加され、レコードは複数の行に分割されます。だから以下は私の問題です:

"abc def \
xyz pqr"

でなければなりません:

"abc def xyz pqr"

私は試した sed -I 's/\\\n/ /g' <file_name>これは機能していません。 trコマンドも試しましたが、文字列ではなく1文字だけが置き換えられます。この問題を処理するためのコマンドを提案してください。

6
Deepak

あなたが使用できるはずです

sed -e :a -e '/\\$/N; s/\\\n//; ta'

Peter Kruminsの Famous Sed One-Liners Explained、Part I39を参照してください。バックスラッシュ「\」を使用します。

7
steeldriver

短い解決策はPerlにあるようです:

Perl -pe 's/\\\n//'
2
vinc17
while read twolines
do printf %s\\n "$twolines"
done <file

...それはとにかくそのファイルの意図された運命だったと私は思うものです。 sedを使用すると、次のことができます。

sed 'N;s/\([^\\]\)\\\n/\1/;P;D' <file

...これは、バックスラッシュで引用された引用符を少なくとも保護しますが、バックスラッシュで引用されたバックスラッシュで引用された引用符はありません。ええ、それは正規表現としては悪夢のようなものですが、while read...donethingは、これらすべてのケースを適切に処理します。ただし、tコマンドは置換が成功するたびに1回再帰できるため、多少の調整を加えれば、steeldriverのソリューションでもすべてのケースを確実に処理できます。

それでも、それが問題ではない場合は、次のようにします。

sed 'N;s/\\\n//;P;D' <file

...仕事をします。

2
mikeserv

awkを使用できます:

$ awk 'sub(/\\$/,""){printf("%s", $0);next};1' file
"abc def xyz pqr"
2
cuonglm

別のawkバリエーション

awk '{ORS = /\\/? "": RS; sub(/\\$/, ""); print}' file
1
iruvar