Como juntar linhas vCards

3

O vCard usa uma maneira especial de dividir linhas longas: Com 75 caracteres, insira uma nova linha do DOS e um espaço. Ingressar, portanto, significa substituir todas as ocorrências da sequência "CR, LF, space" por uma string vazia e deixar o arquivo sozinho. A maneira mais simples que encontrei até agora (usando sed multi-line pesquisar e substituir ) é este:

sed -n '1h;1!H;${;g;s/\r\n //g;p;}' contacts.vcf

Isso é um pouco ilegível. Existe uma maneira mais fácil?

Editar: Implementação resultante baseada em Peter.O's answer .

    
por l0b0 11.06.2012 / 09:59

1 resposta

4

UPDATE: este script awk pode ser mais do que você está procurando:

awk -vRS='\r\n ' -vORS= 1 contacts.vcf 

(postagem original)
Esse script perl funciona, embora na verdade seja mais longo, mesmo quando sed estiver um pouco espaçado; e é obviamente logicamente muito semelhante a sed . Talvez o perl leia o arquivo na memória mais rapidamente (?), Já que ele não tem o , ou não é a primeira linha? para lidar com ...

  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  

Por outro lado: não ser brincalhão, mas se você não puder ler um script sed facilmente e funcionar, deixe-o legível. Não consigo ler nenhum script sed assim! A síndrome do one-liner simplesmente não é adequada para scripts sed que vão além da simples substituição ... sed é mais como uma linguagem de montagem de texto do que uma linguagem de script de alto nível ... perl também é enigmática, mas tende fazer grandes coisas com sua sintaxe concisa.

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
    
por 11.06.2012 / 11:33