Pode sed remover caracteres 'double' de nova linha?

23

Eu tenho um documento com muitas linhas vazias.

Como posso removê-los quando há dois ou mais juntos?

Eu tentei o arquivo sed "s/\n\n//" , mas não funcionou. Nenhum erro.

    
por Michael Durrant 16.05.2013 / 15:14

8 respostas

40

Apenas para remover linhas vazias:

sed  '/^$/d'

sed é orientado a linha, então pensar em termos de "2 ou mais de um determinado byte" funciona exceto quando esse byte é uma nova linha. Então você tem que pensar em algo que funcione para toda a linha.

    
por 16.05.2013 / 15:21
22

Não há necessidade de sed . grep fará:

grep .

grep , SPC, ponto, que corresponde a qualquer linha que contenha pelo menos um caractere).

Também tem:

tr -s '\n'

(aperte qualquer sequência de caracteres de nova linha em um).

Como observado por Chris, ambos não são equivalentes porque remover linhas vazias (como a primeira solução acima e a maioria das outras respostas focadas aqui) não é o mesmo que apertar sequências de caracteres de nova linha conforme solicitado no caso onde a primeira linha é vazio, pois só é necessário um caractere de nova linha para tornar a primeira linha vazia.

    
por 16.05.2013 / 15:29
7

sed não é a melhor ferramenta para isso, já que é baseado em linha e trata \n como o caractere de fim-de-linha que fica complicado. Vendo o resposta sed pode muito bem ser a ferramenta perfeita para o trabalho, ainda, aqui estão algumas outras opções:

  1. Perl

    perl -ne 'print if /./' file.txt
    

    ou

    perl -pe '$/=""; s/\n+/\n/;' file.txt 
    

    Graças a @ruakh que me fez ir e ler this :

    $/

    The input record separator, newline by default. This influences Perl's idea of what a "line" is. Works like awk's RS variable, including treating empty lines as a terminator if set to the null string (an empty line cannot contain any spaces or tabs). You may set it to a multi-character string to match a multi-character terminator, or to undef to read through the end of file. Setting it to "\n\n" means something slightly different than setting to "" , if the file contains consecutive empty lines. Setting to "" will treat two or more consecutive empty lines as a single empty line. Setting to "\n\n" will blindly assume that the next input character belongs to the next paragraph, even if it's a newline.

  2. gawk / awk

    awk '$1' file.txt
    

    Isso funcionará para o exemplo postado, mas como @Stephane Chazelas apontou, ele também excluirá linhas cujo primeiro campo "se parece com" 0 . Isso é mais robusto:

    awk NF file.txt
    
por 16.05.2013 / 15:21
3

O que você quer dizer com remover? remover duplicado (muitas linhas em branco para um) ou remover tudo?

Se você quiser remover duplicado, aqui está o método usando sed:

sed '$!N; /^\(.*\)\n$/!P; D'

Simula o comando uniq .

A melhor opção é usar awk :

awk NF <filename>
    
por 16.05.2013 / 15:39
2

Para a maioria dessas respostas, primeiro é necessário remover o espaço em branco à direita. A remoção de novas linhas duplicadas remove todas as linhas em branco. (Pense sobre isso).

Literalmente interpretado, o OP quer "todas as linhas em branco removidas de um arquivo, se houver alguma linha em branco repetida".

O usuário típico quer "remover apenas linhas em branco duplicadas".

Para fazer isso, primeiro tire o espaço em branco inicial e canalize os cat -s

sed  s/[[:space:]]*$// | cat -s

E, no entanto, isso não removerá uma linha em branco ou uma linha em branco superfluzante.

    
por 11.01.2015 / 23:52
2

Se você quisesse manter uma única linha em branco para qualquer sequência de linhas em branco, você poderia fazer:

sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
    
por 21.05.2014 / 03:13
-2

Experimente sed -e 's#\n\n#\n#g' input.file > output.file usando / como seu separador de campos e parte do seu regex pode ser o problema.

    
por 17.05.2013 / 09:33
-3

Use este comando:

tr -s '\r' '\n'
    
por 28.01.2016 / 19:59

Tags