problema na formatação de texto com tr

1

Eu tenho um arquivo com o texto no seguinte formato

line 1,
line 2,
< Blank line >
line 3,
line 4,
< Blank line >
line 5,
line 4,
< Blank line >

Eu preciso colocá-lo no formato:

line 1,line 2,
< Blank line >
line 3,line 4,
< Blank line >
line 5,line 4,
< Blank line >

Estou tentando:

tr -d '\n' < myfile.txt > myfile_res.txt

Mas então eu fico todo concatenado:

line 1,line 2,line 3,line 4,line 5,line 4

O que eu preciso é remover '\ n' somente das linhas que contêm caracteres e deixar as linhas em branco e acredito que funcionará.

Alguma ideia de como codificar isso?

    
por Topas 08.09.2016 / 10:20

2 respostas

2

tr apenas analisa um caractere por vez, por isso não funciona quando você precisa verificar o contexto.

Como as seções são separadas por linhas vazias, o modo de parágrafo de awk se ajusta bem:

awk -vRS= '{gsub(/\n/, ""); print $0 "\n"}' myfile.txt

A configuração RS empty carrega "registros" separados por linhas vazias e, para cada registro, removemos novamente as novas linhas e depois imprimimos o registro com uma nova linha extra.

Similarmente em Perl, embora com duas novas linhas extras aqui, porque o Perl carrega a nova linha final como qualquer outro caractere:

perl -00ne 's/\n//g; print "$_\n\n"' myfile.txt

Ambos irão tratar várias linhas em branco da mesma forma que uma.

Poderíamos fazer isso com sed, mas é um pouco mais peludo do que minha tentativa original, se precisarmos suportar blocos de mais de duas linhas.

sed -n 'H; $bL; /./d; :L; x; s/\n//g; s/$/\n/; p;' myfile.txt

Anexe a linha atual ao buffer de retenção ( H ) e, em seguida, verifique se essa é a última linha ( $ ), nesse caso, ramifique para L ( bL ). Caso contrário, verifique se há algum caractere ( /./ ) e, em caso afirmativo, exclua ( d ) a linha e volte a iniciar.

Caso contrário (a linha está vazia), passe para L , onde trocamos ( x ) o buffer de espera e a linha atual (espaço padrão), removemos novas linhas ( s/\n//g ), adicionamos outro ao end ( s/$/\n/ ) e imprime implicitamente o espaço do padrão, agora contendo as linhas que coletamos desde a linha em branco anterior. Aqui, linhas extras em branco produzirão mais linhas em branco extras.

    
por 08.09.2016 / 10:42
1

Você pode usar este comando sed

sed '/,/{N;s/\n//;s/$//;}' myfile.txt
    
por 08.09.2016 / 10:42