Para o seu script, você só precisa adicionar dois comandos: P
(imprimir até a primeira nova linha) e D
(excluir até a primeira nova linha e repetir se ainda houver algum texto).
sed -e '{ s/\(.\{75\}\)\(.\)/\n /; P; D }' file
Relacionado a Como ingressar nas linhas vCards , o vCard faz um tipo estranho de divisão de linha: Se uma linha contiver mais de 75 caracteres, insira uma sequência "CR, LF, espaço". Assim, a seguinte linha:
123456789A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789M123456789N123456789O123456789P123456789Q123456789R123456789S123456789U123456789V123456789W123
deve ser dividido nas seguintes linhas:
123456789A123456789B123456789C123456789D123456789E123456789F123456789G12345
6789H123456789I123456789J123456789K123456789L123456789M123456789N123456789
O123456789P123456789Q123456789R123456789S123456789U123456789V123456789W123
Você não pode simplesmente inserir a seqüência de divisão de linha a cada 75 caracteres, porque então haveria mais de 75 caracteres por linha novamente, e você não pode simplesmente inserir após contar 75 caracteres, porque ele só deve ser inserido se a linha é maior que 75 caracteres. Uma maneira de fazer isso é repetir o seguinte comando até que a entrada não seja mais alterada:
sed -e 's/^\(.\{75\}\)\([^\r]\)/\r\n /' < file | sed -e '...' | ...
Isso obviamente não vai funcionar com linhas longas e indeterminadas, e é terrivelmente ineficiente. Como você faria esse tipo de substituição?
Esta é uma tentativa não tão legal para resolver o problema:
#!/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;
}
Tags text-processing sed replace vcards