如何加入 vCard 线路

如何加入 vCard 线路

vCard 使用一种特殊的方式来分割长行:在 75 个字符处,插入一个 DOS 换行符空间。因此加入意味着将所有出现的序列“CR、LF、空格”替换为空字符串否则就不要管该文件。到目前为止我发现的最简单的方法(使用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 脚本!单行综合症根本不适合超越简单替换的 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

相关内容