
vCardは長い行を分割する特別な方法を使用します。 75文字にDOS改行文字が挿入されます。そしてスペース。だから参加するという意味は「CR、LF、Space」シーケンスのすべての項目を空の文字列に置き換えます。それ以外の場合は、ファイルを残してください。これまでに私が見つけた最も簡単な方法(使用sed
複数行の検索と置換)これは:
sed -n '1h;1!H;${;g;s/\r\n //g;p;}' contacts.vcf
これは読みにくいです。より簡単な方法がありますか?
編集する:実施結果に基づいてPeter.Oの答え。
答え1
アップデート:このawk
スクリプトはあなたの要件に適しているかもしれません。
awk -vRS='\r\n ' -vORS= 1 contacts.vcf
(オリジナルの投稿)
スクリプトperl
はうまくいきますが、実際には長くてsed
少し離れていても、論理的にはsed
。perl
ファイルをメモリに読み込む方が速いかもしれません(?)。そうですか、それとも最初の行ではありませんか?扱う...
perl -e 'undef $/; $_=<>; s/\r\n //g; print' contacts.vcf
# | | | |
# ignore get substitute print
# newlines all as needed result
# | | | |
# sed -n '1h; 1!H; ${g; s/\r\n //g; p}' contacts.vcf
一方、冗談ではありません。しかし、sedスクリプトを簡単に読み取ることができず、うまくいけば、それを読むことができるようにしてください。私はそのようなsedスクリプトを読むことができません! Single Line Syndrome は、単なる交換以上の sed スクリプティングには適していません。sed
高度なスクリプト言語ではなく、テキストアセンブリ言語に近いです。perl
また、やや難解ですが、簡潔な構文で動作する傾向があります。
sed -n '
1h # if 1st line, copy the pattern space to the hold space
1!H # if NOT 1st line, append the pattern to the hold space
${ # if this is the last line
g # overwrite current pattern with accumulated patterns from hold space
s/\r\n //g # make required substitutions
p # print the final result.
}' contacts.vcf