Como dividir linhas vCards

1

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?

    
por l0b0 11.06.2012 / 11:11

2 respostas

4

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
    
por 11.06.2012 / 14:10
2

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;
}
    
por 11.06.2012 / 11:46