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


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.


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.


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


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"


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


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

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:

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.