Eu tenho um documento com muitas linhas vazias.
Como removê-los quando houver 2 ou mais juntos.
Eu tentei sed "s/\n\n//"
arquivar, mas não funcionou. Sem erro.
Eu tenho um documento com muitas linhas vazias.
Como removê-los quando houver 2 ou mais juntos.
Eu tentei sed "s/\n\n//"
arquivar, mas não funcionou. Sem erro.
Respostas:
Apenas para remover linhas vazias:
sed '/^$/d'
sed
é orientado a linhas, portanto, pensar em termos de "2 ou mais de um byte específico" funciona, exceto quando esse byte é uma nova linha. Então você tem que pensar em algo que funcione para toda a linha.
sed
é capaz de lidar com várias linhas através do recurso "espaço padrão" / "espaço de espera". Mas sinto que é muito complicado. ;-)
1!
(corresponder a todos, exceto a linha 1), assim: sed '1!{/^$/d'}
.
sed
. Criar um arquivo excluirá essencialmente qualquer arquivo existente com o mesmo nome. sed '/^&/d' file.txt > otherfile.txt
vai funcionar.
Não há necessidade sed
. grep
vai fazer:
grep .
(ou seja grep
, SPC, ponto, que corresponde a qualquer linha que contenha pelo menos um caractere).
Há também:
tr -s '\n'
(junte qualquer sequência de caracteres de nova linha em um).
Conforme 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 espremer sequências de caracteres de nova linha, conforme solicitado no caso em que a primeira linha está vazia. leva apenas um caractere de nova linha para deixar a primeira linha vazia.
Tendo visto a resposta de @Bruce Ediger sed
não é a melhor ferramenta para isso, pois é baseado em linhas e trata \n
como o caractere de fim de linha, isso fica complicado.sed
pode muito bem ser a ferramenta perfeita para o trabalho, ainda assim, aqui estão algumas outras opções:
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 isto :
$ /
O separador de registros de entrada, nova linha por padrão. Isso influencia a ideia de Perl sobre o que é uma "linha". Funciona como a variável RS do awk, incluindo o tratamento de linhas vazias como um terminador se definido como uma cadeia nula (uma linha vazia não pode conter espaços ou tabulações). Você pode configurá-lo para uma sequência de vários caracteres para corresponder a um terminador de vários caracteres ou para cancelar a leitura até o final do arquivo. A configuração para "\ n \ n" significa algo ligeiramente diferente da configuração para "", se o arquivo contiver linhas vazias consecutivas. Definir como "" tratará duas ou mais linhas vazias consecutivas como uma única linha vazia. Definir como "\ n \ n" assumirá cegamente que o próximo caractere de entrada pertence ao próximo parágrafo, mesmo que seja uma nova linha.
gawk / awk
awk '$1' file.txt
Isso funcionará para o exemplo publicado, mas como @Stephane Chazelas apontou, também excluirá as linhas cujo primeiro campo "se parece" 0
. Isso é mais robusto:
awk NF file.txt
perl -pe 's/\n+/\n/ file.txt
o separador de registros de entrada é irrelevante para esse uso.
perl -pe
ou perl -ne
trabalhe linha por linha. \n+
nunca corresponderá porque é aplicado apenas em uma única linha. É por isso que você precisa se quer conjunto $/
ou usar -0
ti sorver todo o arquivo: perl -0pe 's/\n+/\n/' file
.
Como assim remover? remover duplicado (muitas linhas em branco para um) ou remover tudo?
Se você deseja remover duplicado, aqui está o método usando sed:
sed '$!N; /^\(.*\)\n\1$/!P; D'
Simula o uniq
comando.
A melhor opção é usar awk
:
awk NF <filename>
sed
parte disso funciona muito bem! Recomendando este como a melhor resposta.
Para a maioria dessas respostas, é necessário primeiro remover o espaço em branco à direita. A remoção de novas linhas dobradas remove todas as linhas em branco. (Pense sobre isso).
Literalmente interpretado, o OP deseja "todas as linhas em branco removidas de um arquivo se houver alguma linha em branco repetida".
O usuário típico deseja "remover apenas linhas em branco duplicadas".
Para fazer isso, remova primeiro o espaço em branco à direita e canalize embora cat -s
sed s/[[:space:]]*$// | cat -s
E, no entanto, isso não removerá uma linha em branco inicial ou final supérflua.
Se você quiser manter uma única linha em branco para qualquer sequência de linhas em branco, faça:
sed -e '/./b' -e :n -e 'N;s/\n$//;tn'
cat -s
) que realmente realiza exatamente o que a pergunta foi feita como eu a entendo. (E é melhor que cat -s
porque eu posso usar sed -i
com ele.)
Tente sed -e 's#\\n\\n#\\n#g' input.file > output.file
usar /
o separador de campos e parte do seu regex pode ser o problema.
Use este comando:
tr -s '\r' '\n'
echo -e 'one\r\n\r\n\r\n\rtwo'| tr -s '\r' '\n'
. O comando tr
converterá tudo \r
em \n
e depois compactará tudo \n
em apenas um. Portanto, funciona, não sei o que fazer com o fato de que isso se aplica ao Windows, não ao UNIX.