Respostas:
Tente o seguinte:
grep -v -e '^$' foo.txt
A -e
opção permite padrões de expressão regular para correspondência.
As aspas simples ^$
fazem com que funcione para Cshell. Outras conchas ficarão felizes com aspas simples ou duplas.
UPDATE: Isso funciona para mim para um arquivo com linhas em branco ou "todos os espaços em branco" (como linhas de janelas com finais de linha de estilo "\ r \ n"), enquanto o acima remove apenas arquivos com linhas em branco e finais de linha de estilo unix:
grep -v -e '^[[:space:]]*$' foo.txt
grep -E -v
, tudo depois -e
é interpretado como o padrão.
grep -v -e '^[[:space:]]*$' -e '^#' file
fornecerá a você todas as linhas não em branco e sem comentários em um script ou arquivo de configuração (ou qualquer tipo de arquivo que use o caractere hash para comentários).
-e
opção permite padrões regex para correspondência." Isso é muito enganador . -e
é uma definição (POSIX-) para: This can be used to specify multiple search patterns, or to protect a pattern beginning with a hyphen (-).
(do manual ). O Grep já espera uma expressão regular (básica) por padrão. Por este padrão, você pode deixar de fora -e
inteiramente: grep -v '^[[:space:]]*$' foo.txt
.
Mantenha simples.
grep . filename.txt
Usar:
$ dos2unix file
$ grep -v "^$" file
Ou simplesmente awk:
awk 'NF' file
Se você não possui o dos2unix, poderá usar ferramentas como tr :
tr -d '\r' < "$file" > t ; mv t "$file"
awk
.
grep -v "^[[:space:]]*$"
The -v makes it print lines that do not completely match
===Each part explained===
^ match start of line
[[:space:]] match whitespace- spaces, tabs, carriage returns, etc.
* previous match (whitespace) may exist from 0 to infinite times
$ match end of line
Executando o código
$ echo "
> hello
>
> ok" |
> grep -v "^[[:space:]]*$"
hello
ok
Para entender mais sobre como / por que isso funciona, recomendo ler expressões regulares. http://www.regular-expressions.info/tutorial.html
Prefiro usar egrep
, embora no meu teste com um arquivo genuíno com linha em branco sua abordagem tenha funcionado bem (embora sem aspas no meu teste). Isso funcionou também:
egrep -v "^(\r?\n)?$" filename.txt
Se você tiver seqüências de várias linhas em branco em uma linha e desejar apenas uma linha em branco por sequência, tente
grep -v "unwantedThing" foo.txt | cat -s
cat -s
suprime repetidas linhas de saída vazias.
Sua saída iria de
match1
match2
para
match1
match2
As três linhas em branco na saída original seriam compactadas ou "comprimidas" em uma linha em branco.
O mesmo que as respostas anteriores:
grep -v -e '^$' foo.txt
Aqui, grep -e
significa a versão estendida do grep . '^ $' significa que não há nenhum caractere entre ^ (Início da linha) e $ (final da linha). '^' e '$' são caracteres de expressão regular.
Então o comando grep -v
imprimirá todas as linhas que não correspondem a esse padrão (sem caracteres entre ^ e $).
Dessa forma, as linhas em branco vazias são eliminadas.
-e
não significa "a versão estendida do grep", talvez você esteja confuso -E
? O manual diz claramente que -e
apenas diz explicitamente que um padrão segue. Como o padrão não inicia com um traço, e você está definindo apenas um padrão de qualquer maneira, é possível deixá-lo de fora, pois por padrão o grep espera um padrão de regex: grep -v '^$' foo.txt
(não há necessidade de funcionalidade de regex estendida). Também vale ressaltar que isso não elimina as linhas em branco no arquivo, apenas as que são canalizadas pela saída. Para esse caso, sed -i
seria a ferramenta certa.
Eu tentei muito, mas isso parece funcionar (supondo que \r
você esteja te mordendo aqui):
printf "\r" | egrep -xv "[[:space:]]*"
Usando Perl:
perl -ne 'print if /\S/'
\S
significa combinar caracteres não em branco.
egrep -v "^ \ s \ s +"
O egrep já faz regex e o \ s é um espaço em branco.
O + duplica o padrão atual.
O ^ é para o começo
Usar:
grep pattern filename.txt | uniq
uniq
reduzirá as linhas em branco adjacentes a apenas uma linha em branco, mas não as removerá completamente. Ainda assim, eu gosto de tentar usar uniq
assim. A classificação primeiro removeria efetivamente todas as linhas em branco - deixando apenas uma, mas reorganizar a ordem das linhas pode não ser aceitável.
Aqui está outra maneira de remover as linhas brancas e as linhas que começam com o #
sinal. Eu acho que isso é bastante útil para ler arquivos de configuração.
[root@localhost ~]# cat /etc/sudoers | egrep -v '^(#|$)'
Defaults requiretty
Defaults !visiblepw
Defaults always_set_home
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR
LS_COLORS"
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
stack ALL=(ALL) NOPASSWD: ALL
É verdade que o uso de grep -v -e '^ $' pode funcionar, no entanto, não remove linhas em branco que possuem 1 ou mais espaços . Eu achei a resposta mais fácil e simples para remover linhas em branco é o uso do awk . O seguinte é um pouco modificado dos caras do awk acima:
awk 'NF' foo.txt
Mas como essa pergunta é para usar o grep, vou responder o seguinte:
grep -v '^ *$' foo.txt
Nota : o espaço em branco entre ^ e *.
Ou você pode usar \ s para representar o espaço em branco como este:
grep -v '^\s*$' foo.txt