如何分割 vCard 行

如何分割 vCard 行

相关如何加入 vCard 线路, vCard 进行了一种奇怪的行分割:如果一行包含超过 75 个字符,请插入“CR、LF、空格”序列。因此以下行:

123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789S123456789U123456789V123456789W123

应分为以下几行:

123456789A123456789B123456789C123456789D123456789E123456789F123456789G12345
 6789H123456789I123456789J123456789K123456789L123456789M123456789N123456789
 O123456789P123456789Q123456789R123456789S123456789U123456789V123456789W123

您不能仅每 75 个字符插入行拆分序列,因为这样每行又会超过 75 个字符,并且您不能在计数 75 个字符后插入,因为只有当该行是更长超过 75 个字符。一种方法是重复以下命令,直到输入不再更改:

sed -e 's/^\(.\{75\}\)\([^\r]\)/\1\r\n \2/' < file | sed -e '...' | ...

这显然不适用于不确定的长线,而且效率极低。你会如何进行这种替换?

答案1

在您的脚本中,您只需要添加两个命令:(P打印到第一个换行符)和D(删除到第一个换行符,如果还有任何文本则重复)。

sed -e '{ s/\(.\{75\}\)\(.\)/\1\n \2/; P; D }' file

答案2

这是一个不太好尝试解决问题:

#!/usr/bin/awk -f

{
    if (length($0) > 76) {
        printf("%s\r\n ", substr($0, 1, 75));
        $0 = substr($0, 76);
        while (length($0) > 74) {
            printf("%s\r\n ", substr($0, 1, 74));
            $0 = substr($0, 75);
        }
    }
    print $0;
}

相关内容