Remove newline \ linefeed antes de uma correspondência regex

1

Atualmente estou escrevendo um script bash para analisar um arquivo de texto simples. Agora tenho o problema de que existem algumas ocorrências de novas linhas, onde nenhuma deve ser. Deixe-me dar um exemplo

Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im
Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La

A string "Klassenverband" está em uma nova linha. Eu não quero isso. Para remover o novo caractere de linha, tentei comandos diferentes com sed e awk:

awk '/^\([a-zA-Z]\{4\}\)/{printf "%s ",$0;next} 1' file
sed '/^\([a-zA-Z]\{4\}\)/{N;s/\n//;}' file

O que eu tenho até agora é que todas as strings neccecary podem ser extraídas com o seguinte Regex

^\([a-zA-Z]\{4\}\)

Estou esperando uma saída como essa

Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La

Editar: Isso funcionou para mim. Mas o arquivo de texto precisa ser um arquivo de texto unix no arquivo DOS

sed '$!N; s/\n\([[:alpha:]]\{4,\}\)/ /; P;D' file
    
por Nicolai Schmid 16.09.2016 / 16:02

3 respostas

1

Que tal

sed '$!N; s/\n\([[:alpha:]]\{4,\}\)/ /; P;D' file
Q1bcd    3 - 4 ---   ---  ---     Ba     Klasse hat Aufgab..
8 a     3    ---        ---     Mr
6 b      3 - 4 ---   ---  ---     Bu     Unterricht im Klassenverband
8 a     4    ---        ---     Ke
7 a      4    De   Bi   r24    La
    
por 16.09.2016 / 16:36
1

Com perl , supondo que o arquivo de entrada seja pequeno o suficiente para caber na memória:

perl -0777 -pe 's/\n([a-zA-Z]{4})/ $1/g' file.txt
    
por 16.09.2016 / 16:20
0

Isso é desajeitado; pode haver uma maneira melhor

awk '{ c=""; if (NR!=1 && !/^[a-zA-Z]{4}/) { c="\n" }; printf("%s%s",c,$0) } END { print "" }' 

Basicamente, para cada linha nós o imprimimos sem o caractere LF. Então podemos prefixar a próxima linha com LF, se não quisermos mesclar essa linha.

Finalmente, isso significa que a última linha é a falta da LF final, então adicionamos isso.

    
por 16.09.2016 / 16:33