Como remover linhas em branco de um arquivo no shell?

22

Eu quero remover todas as linhas vazias de um arquivo. Mesmo que a linha contenha espaços ou tabulações, ela também deve ser removida.

    
por Jamshed Ansari user3000272 16.11.2013 / 21:49

6 respostas

25

Apenas grep para não brancos:

grep '[^[:blank:]]' < file.in > file.out

[:blank:] , dentro dos intervalos de caracteres ( [...] ), é chamado de classe de caracteres POSIX. Há alguns como [:alpha:] , [:digit:] ... [:blank:] corresponde ao espaço em branco horizontal (no código do idioma POSIX, espaço e tabulação, mas em outros locais pode haver mais, como todos os caracteres de espaçamento horizontal Unicode em Locales UTF8), enquanto [[:space:]] corresponde a caracteres de espaço em branco horizontais e verticais (o mesmo que [:blank:] mais itens como a guia vertical, o feed de formulário ...).

grep '[:blank:]'

Retornaria as linhas que contêm qualquer um dos caracteres, : , b , l , a , n ou k . As classes de caracteres são reconhecidas apenas em [...] e ^ em [...] nega o conjunto. Então, [^[:blank:]] significa qualquer caractere, exceto os em branco.

    
por 16.11.2013 / 22:09
16

Aqui está uma solução awk :

$ awk 'NF' file

Com awk , NF definido apenas em linhas não vazias. Quando essa condição corresponder, a ação awk padrão que é print imprimirá a linha inteira.

    
por 17.06.2014 / 14:10
7

Que tal:

sed -e 's/^[[:blank:]]*$//' source_file > newfile

ou

sed -e '/^[[:blank:]]*$/d' source_file > newfile

i.e.

Para cada linha, substitua:

  • se for iniciado (" ^ ")
  • com espaços ou tabulações (" [[:blank:]] ") zero ou mais vezes (" * ")
  • e, em seguida, é o final da linha (" $ ")

Mais informações sobre :: blank :: e outros caracteres especiais no link

    
por 16.11.2013 / 21:55
4

Você pode usar o comando sed para remover linhas em branco:

sed '/^$/d' in > out

Este comando apaga todas as linhas vazias do arquivo "in"

    
por 17.06.2014 / 13:34
3

Parece que encontrei um não tão rápido, mas engraçado por fim:

| xargs -L1

    
por 15.06.2016 / 17:29
0

Experimente ex -way:

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

Para vários arquivos (editar no local):

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

Observação: o comando :bufdo 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
    
por 05.05.2015 / 18:02