Combina várias linhas até a sequência de caracteres

0

Tentando combinar várias linhas, se não tiver um final de string de mensagem. Também gostaria de remover o prefixo de todos, exceto da primeira linha.

Entrada:

b929e3e1-29db this is a long message that
abc074df-48a1 is continued onto multiple
dfd4c683-ab48 lines#EOM
ff513a72-570d this is a short message#EOM
980d10aa-bbed another short message#EOM

Saída:

b929e3e1-29db this is a long message that is continued onto multiple lines
ff513a72-570d this is a short message
980d10aa-bbed another short message

O ideal é usar ferramentas comuns disponíveis via linha de comando. (ex: awk, sed)

    
por monkey-wrench 11.09.2016 / 18:31

1 resposta

1

Com o GNU awk 1

gawk -vRS='#EOM\n' '{gsub(/\n[[:xdigit:]-]+/,"");} {$1=$1} 1' file.txt
  • defina o separador de registro como #EOM seguido por uma nova linha
  • remove sequências de dígitos hexadecimais e hífens precedidos por novas linhas; isto retém a sequência inicial de cada registro desde que sua nova linha foi comida pelo RS anterior
  • reatribuir um campo $1=$1 para forçar o registro a ser reavaliado com separadores de saída padrão
  • imprime o registro (porque 1 é verdadeiro)

Teste

$ gawk -vRS='#EOM\n' '{gsub(/\n[[:xdigit:]-]+/,"");} {$1=$1} 1' file.txt
b929e3e1-29db this is a long message that is continued onto multiple lines
ff513a72-570d this is a short message
980d10aa-bbed another short message


1 . ele não parece funcionar com mawk , por razões que eu não entendo (mesmo depois de substituir + por \{1,\} e vários outros ajustes)

    
por 11.09.2016 / 19:49