Linuxには、レコードごとに1行を含むファイルがありますが、その行にいくつかの改行文字が含まれていると問題が発生します。この場合、バックスラッシュは行の終わりに追加され、レコードは複数の行に分割されます。だから以下は私の問題です:
"abc def \
xyz pqr"
でなければなりません:
"abc def xyz pqr"
私は試した sed -I 's/\\\n/ /g' <file_name>
これは機能していません。 tr
コマンドも試しましたが、文字列ではなく1文字だけが置き換えられます。この問題を処理するためのコマンドを提案してください。
あなたが使用できるはずです
sed -e :a -e '/\\$/N; s/\\\n//; ta'
Peter Kruminsの Famous Sed One-Liners Explained、Part I 、39を参照してください。バックスラッシュ「\」を使用します。
短い解決策はPerlにあるようです:
Perl -pe 's/\\\n//'
while read twolines
do printf %s\\n "$twolines"
done <file
...それはとにかくそのファイルの意図された運命だったと私は思うものです。 sed
を使用すると、次のことができます。
sed 'N;s/\([^\\]\)\\\n/\1/;P;D' <file
...これは、バックスラッシュで引用された引用符を少なくとも保護しますが、バックスラッシュで引用されたバックスラッシュで引用された引用符はありません。ええ、それは正規表現としては悪夢のようなものですが、while read...done
thingは、これらすべてのケースを適切に処理します。ただし、t
コマンドは置換が成功するたびに1回再帰できるため、多少の調整を加えれば、steeldriverのソリューションでもすべてのケースを確実に処理できます。
それでも、それが問題ではない場合は、次のようにします。
sed 'N;s/\\\n//;P;D' <file
...仕事をします。
awk
を使用できます:
$ awk 'sub(/\\$/,""){printf("%s", $0);next};1' file
"abc def xyz pqr"
別のawk
バリエーション
awk '{ORS = /\\/? "": RS; sub(/\\$/, ""); print}' file