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
Respostas:
Esta linha sed deve fazer o truque:
Os
-i
meios para editar o arquivo no local.fonte
\s*
é a mesma solução dada pela pergunta stackoverflowbad flag in substitute command: 'e'
grep
A solução simples é usar o comando
grep
( GNU ou BSD ) como abaixo.Remova linhas em branco (sem incluir linhas com espaços).
Remova linhas completamente em branco (incluindo linhas com espaços).
Nota: Se você obtiver cores indesejadas, isso significa que você
grep
tem aliases paragrep --color=auto
(marque portype grep
). Nesse caso, você pode adicionar--color=none
parâ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:
ou incluindo linhas com espaços:
Veja também:
sed
: Excluir linhas vazias usando sedawk
: Remover linhas em branco usando awkfonte
grep .
parece ser a solução mais simples.grep .
comparação com as outras soluções é que destacará todo o texto em vermelho. As outras soluções podem preservar as cores originais. Compareunbuffer apt search foo | grep .
comunbuffer apt search foo | grep -v ^$
grep
está aliasgrep --color=auto
no seu sistema (verifique por :)type grep
. Você pode executá-lo como\grep
ou usar o--color=none
parâmetrogrep --color=none .
, você vai ter todo o texto branco, que substitui a formatação de cor do comando original (exemplo:apt search foo
)grep .
corresponderá a linhas contendo apenas espaços, que o OP diz que não é desejado.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.fonte
Você pode usar a opção -v com grep para remover as linhas vazias correspondentes.
Como isso
fonte
-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.grep -Ev '^#|^$' file.txt
Aqui está uma
awk
solução:Com o Awk,
NF
defina 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.fonte
Para remover linhas vazias, você pode pressionar novas repetições de linha com
tr
:fonte
xargs se você não se importa de remover espaços em branco
fonte
Ex / Vim
Aqui está o método usando o
ex
editor (parte do Vim):Para vários arquivos (editar no local):
Nota: O
:bufdo
comando não é POSIX .Sem modificar o arquivo (basta imprimir na saída padrão):
fonte
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
fonte
Provavelmente, a maneira mais fácil de remover linhas em branco (sem espaços) é usar
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.
fonte