vCard回線に参加する方法

vCard回線に参加する方法

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少し離れていても、論理的にはsedperlファイルをメモリに読み込む方が速いかもしれません(?)。そうですか、それとも最初の行ではありませんか?扱う...

  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

おすすめ記事