Como remover linhas em branco de um arquivo (incluindo tabulações e espaços)?

23

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.

Usuário do Jamshed Ansari3000272
fonte

Respostas:

26

Apenas greppara não-espaços em branco:

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

[:blank:], dentro dos intervalos de caracteres ( [...]), é chamado de classe de caracteres POSIX. Existem alguns exemplos [:alpha:], [:digit:]... [:blank:]corresponde ao espaço em branco horizontal (na localidade POSIX, espaço e tabulação, mas em outras localidades, pode haver mais, como todos os caracteres de espaçamento horizontal Unicode nos locais UTF8), enquanto [[:space:]]corresponde à horizontal e vertical branco caracteres de espaço (o mesmo que [:blank:]mais itens como guia vertical, feed de formulário ...).

grep '[:blank:]'

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

Stéphane Chazelas
fonte
1
também deve haver um $para o fim da linha?
Michael Durrant
@MichaelDurrant Não é ancorado em ambos os lados
jordanm
1
@MichaelDurrant. [^[:blank:]]$corresponderia apenas às linhas que terminam em um espaço em branco. Queremos linhas que contêm um não-branco em qualquer lugar
Stéphane Chazelas
@StephaneChazelas Tentei grep [: blank:] SOURCEFILE até este comando está funcionando. Eu entendo que [] é para a classe dos personagens, você pode me dar uma idéia de como isso funciona? o trecho: blank: é novo para mim.
Jamshed Ansari user3000272
Existem casos em grep -E '\S'que não funcionariam?
terdon
21

Aqui está uma awksolução:

$ awk NF file

Com awk, NFdefinido apenas em linhas que não estejam em branco. Quando essa condição corresponder, a awkação padrão printimprimirá a linha inteira.

cuonglm
fonte
Puro, isso também remove linhas com espaços em branco.
wisbucky 25/04
7

E se:

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

ou

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

ie

Para cada linha, substitua:

  • se iniciar (" ^")
  • com espaços ou tabulações (" [[:blank:]]") zero ou mais vezes (" *")
  • e então é o fim da linha (" $")

Mais informações sobre :: blank :: e outros caracteres especiais em http://www.zytrax.com/tech/web/regex.htm#special

Michael Durrant
fonte
4
[[:space:]]inclui guias. Caso contrário, sua regex falharia se um espaço seguisse uma guia.
Jordanm #
As páginas wctype(3)e isalpha(3)man descrevem o que as classes de caracteres corresponderão.
Jordanm #
Você pode remover o primeiro que não responde à pergunta.
Stéphane Chazelas
@MichaelDurrant, você pode escrever algo sobre [[: blank:]]?
Jamshed Ansari user3000272
Informação adicionada para [[: blank ::]]. Stephane, por que o primeiro não funciona? Eu pensei que // no final substituiria a linha sem nada.
precisa
4

Você pode usar o sedcomando para remover linhas em branco:

sed '/^$/d' in > out

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

Raghavendra
fonte
Isso não exclui linhas que contêm apenas espaço e tabulação, conforme solicitado especificamente.
dave_thompson_085 15/06
3

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

| xargs -L1

poige
fonte
1
Bom e curto, mas ele faz mais: remova os espaços e as guias iniciais também.
jringoot
Oh, descobriu-se ser ainda mais capaz? - Agradável! ;-P
poige
1
E ele trunca linhas (padrão em 1024 caracteres) Ver manpages: linux.die.net/man/1/xargs
jringoot
Eu estou caindo mais profundo no amor com que ferramenta simples !!! 11)
poige
0

Tente 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

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
note que o bufdo não é POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
Steven Penny
0

Use o seguinte comando:

grep '\S' FILE

que remove todas as linhas, incluindo espaços ou tabulações.

Caso contrário, a remoção não incluindo linhas com espaços / tabulações, use:

grep . FILE

Por exemplo:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE
line1

line2

line3
$  grep '\S' FILE
line1
line2
line3
$  grep . FILE
line1
line2

line3

Veja também:

kenorb
fonte