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