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



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.


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:


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.


+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

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.


6

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

cat file.txt | tr -s '\n' '\n'

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

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

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.