関連vCard回線に参加する方法、vCardは奇妙な行分割を実行します。1行に75文字を超える場合は、「CR、LF、スペース」シーケンスを挿入してください。したがって、次の行は次のようになります。
123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789S123456789U123456789V123456789W123
次の行に分割する必要があります。
123456789A123456789B123456789C123456789D123456789E123456789F123456789G12345
6789H123456789I123456789J123456789K123456789L123456789M123456789N123456789
O123456789P123456789Q123456789R123456789S123456789U123456789V123456789W123
75文字ごとに行分割シーケンスを挿入することはできません。これは、各行が再び75文字より長くなるためです。そして75文字を数えた後は挿入できません。これは、行が次の場合にのみ発生するためです。もっと長く75文字以上。 1つの方法は、入力が変更されなくなるまで次のコマンドを繰り返すことです。
sed -e 's/^\(.\{75\}\)\([^\r]\)/\1\r\n \2/' < file | sed -e '...' | ...
これは明らかに長く不確実な行には機能せず、非常に非効率的です。この代替品をどのように作成しますか?
答え1
スクリプトに2つのコマンドを追加するだけです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;
}