Como remover linhas vazias / em branco de um arquivo no Unix (incluindo espaços)?

61

Como removo linhas vazias / em branco (incluindo apenas espaços) em um arquivo no Unix / Linux usando a linha de comando?

conteúdo de file.txt

Line:Text
1:<blank>
2:AAA
3:<blank>
4:BBB
5:<blank>
6:<space><space><space>CCC
7:<space><space>
8:DDD

saída desejada

1:AAA
2:BBB
3:<space><space><space>CCC
4:DDD
Michael Ellick Ang
fonte
1
Para awk, consulte: Remover linhas em branco no awk , ou usando grep , em geral, consulte: Como remover linhas em branco de um arquivo no shell?
Kenorb 5/05
1
Esta é uma resposta épica que praticamente fornece todas as soluções possíveis usando grep, sed, awk: stackoverflow.com/questions/16414410/…
wisbucky 25/04

Respostas:

87

Esta linha sed deve fazer o truque:

sed -i '/^$/d' file.txt

Os -imeios para editar o arquivo no local.

Martijn Heemels
fonte
13
Na verdade, ele precisa ser "/ ^ * $ / d" para remover linhas que contêm apenas espaços.
Sean Reifschneider 28/03
2
@SeanReifschneider Esse requisito não estava em questão quando esta resposta foi escrita?
kasperd
4
@SeanReifschneider "/ ^ \ s * $ / d" não seria melhor, pois incluiria guias? Embora não seja mencionado no post original, parece uma opção mais forte para mim.
mrswadge
Eu recebobad flag in substitute command: 'e'
ishandutta2007 13/04
31

grep

A solução simples é usar o comando grep( GNU ou BSD ) como abaixo.

  • Remova linhas em branco (sem incluir linhas com espaços).

    grep . file.txt
    
  • Remova linhas completamente em branco (incluindo linhas com espaços).

    grep "\S" file.txt
    

Nota: Se você obtiver cores indesejadas, isso significa que você greptem aliases para grep --color=auto(marque por type grep). Nesse caso, você pode adicionar --color=noneparâmetro ou simplesmente executar o comando como \grep(que ignora o alias).


ripgrep

Semelhante ao ripgrep(adequado para arquivos muito maiores).

Remova linhas em branco que não incluem linhas com espaços:

rg -N . file.txt

ou incluindo linhas com espaços:

rg -N "\S" file.txt

Veja também:

kenorb
fonte
2
grep .parece ser a solução mais simples.
21318 Leo
A desvantagem em grep .comparação com as outras soluções é que destacará todo o texto em vermelho. As outras soluções podem preservar as cores originais. Compare unbuffer apt search foo | grep .comunbuffer apt search foo | grep -v ^$
wisbucky 25/04
1
@wisbucky Você vê cores, porque grepestá alias grep --color=autono seu sistema (verifique por :) type grep. Você pode executá-lo como \grepou usar o --color=noneparâmetro
kenorb 25/04
@kenorb Se você usar grep --color=none ., você vai ter todo o texto branco, que substitui a formatação de cor do comando original (exemplo: apt search foo)
wisbucky
grep .corresponderá a linhas contendo apenas espaços, que o OP diz que não é desejado.
Jim L.
27
sed '/^$/d' file.txt

d é o comando sed para excluir uma linha. ^$é uma expressão regular que corresponde apenas a uma linha em branco, um início de linha seguido por um final de linha.

Kamil Kisiel
fonte
+1 para a explicação #
Alex Raj Kaliamoorthy 17/02
Este comando não produz a mesma saída solicitada pelo OP (produz 5 linhas, não 4).
kenorb 22/07
22

Você pode usar a opção -v com grep para remover as linhas vazias correspondentes.

Como isso

grep -Ev "^$" file.txt
jdabney
fonte
4
Eu não acredito que você precise do -E, pelo menos não com o GNU grep, mas além disso, estou muito satisfeito por ver isso feito com o grep! É o que eu busco em preferência ao sed, toda vez; os filtros em linha me parecem melhores do que os editores em linha.
21411 MadHatter
Se você quiser pular as linhas comentadas e em branco, especialmente ao lidar com arquivos conf, usegrep -Ev '^#|^$' file.txt
Govind Kailas
7

Aqui está uma awksolução:

awk NF file.txt

Com o Awk, NFdefina apenas em linhas que não estejam em branco. Quando essa condição corresponde, a ação padrão do Awk é imprimir a linha inteira.

Steven Penny
fonte
6

Para remover linhas vazias, você pode pressionar novas repetições de linha com tr:

cat file.txt | tr -s '\n' '\n'
siddhadev
fonte
Isso produz 6 linhas, não 4, conforme solicitado pelo OP.
kenorb 22/07
1

xargs se você não se importa de remover espaços em branco

$ docker run -it --rm alpine sh
/ # cat <<eof > /tmp/file
> one
>
>   two
> three
>
>
>   four
> eof
/ # cat /tmp/file
one

  two
three


  four
/ # cat /tmp/file | xargs -n1
one
two
three
four
convocação cristã
fonte
0

Ex / Vim

Aqui está o método usando o exeditor (parte do Vim):

ex -s +'v/\S/d' -cwq test.txt

Para vários arquivos (editar no local):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Nota: O :bufdocomando não é POSIX .

Sem modificar o arquivo (basta imprimir na saída padrão):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin
kenorb
fonte
0

Para mim, o comando @ martigin-heemels estava lançando um erro que corrigia (ou seja, um parâmetro fictício para i),

sed -i '' '/^$/d' file.txt

ishandutta2007
fonte
0

Provavelmente, a maneira mais fácil de remover linhas em branco (sem espaços) é usar cat -s:

$ cat -s file
$ some-command | cat -s

Pelo menos se você não quiser editar um arquivo no local, mas, por exemplo, escreva no terminal. Além disso, ele não envolve nenhum negócio engraçado de regex, por isso é super fácil de lembrar, mesmo para pessoas que não são amigas do RE.


De man cat:

-s, --squeeze-blank never more than one single blank line

Pode ser diferente em diferentes sistemas operacionais, mas estava presente em alguns Linux e OpenBSD da última vez que verifiquei.

kyrill
fonte