linux - txt - Excluir linhas vazias usando sed




Eu estou tentando excluir linhas vazias usando sed:

sed '/^$/d'

mas eu não tenho sorte com isso.

Por exemplo, eu tenho estas linhas:

xxxxxx


yyyyyy


zzzzzz

e eu quero que seja assim:

xxxxxx
yyyyyy
zzzzzz

Qual deve ser o código para isso?


É provável que você tenha visto o comportamento inesperado porque seu arquivo de texto foi criado no Windows, portanto, a sequência de fim de linha é \r\n . Você pode usar dos2unix para convertê-lo em um arquivo de texto estilo UNIX antes de executar sed ou usar

sed -r "/^\r?$/d"

para remover linhas em branco, independentemente de haver ou não a devolução de carro.


Eu acredito que este é o mais fácil e rápido:

cat file.txt | grep .

Se você precisar ignorar todas as linhas de espaços em branco, tente o seguinte:

cat file.txt | grep '\S'

Exemplo:

s="\
\
a\
 b\
\
Below is TAB:\
    \
Below is space:\
 \
c\
\
"; echo "$s" | grep . | wc -l; echo "$s" | grep '\S' | wc -l

saídas

7
5

Eu estou awk falta da solução awk :

awk 'NF' file

Qual retornaria:

xxxxxx
yyyyyy
zzzzzz

Como é que isso funciona? Como NF significa "number of fields", as linhas que estão vazias possuem 0 fiedls, de modo que awk avalia 0 como False e nenhuma linha é impressa; no entanto, se houver pelo menos um campo, a avaliação é True e faz o awk executar sua ação padrão: imprimir a linha atual.


Minha resposta específica do bash é recomendar o uso do operador de substituição de perl com o sinalizador padrão global g para isso, da seguinte maneira:

$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz

Esta resposta ilustra a contabilização de se as linhas vazias possuem ou não espaços ( [\ ]* ), bem como a utilização de | para separar vários termos / campos de pesquisa. Testado no macOS High Sierra e no CentOS 6/7.

FYI, o sed '/^$/d' $file original do OP sed '/^$/d' $file funciona muito bem no bash Terminal no macOS High Sierra e no CentOS 6/7 Linux em um cluster de supercomputação de alto desempenho.


Para mim, com o FreeBSD 10.1 com sed funcionou apenas esta solução:

sed -e '/^[     ]*$/d' "testfile"

inside [] existem símbolos de espaço e tabulação.

arquivo de teste contém:

fffffff next 1 tabline ffffffffffff

ffffffff next 1 Space line ffffffffffff

ffffffff empty 1 lines ffffffffffff

============ EOF =============

Você pode fazer algo parecido usando "grep" também:

egrep -v "^$" file.txt

Você pode ter espaços ou tabulações na sua linha "vazia". Use classes POSIX com sed para remover todas as linhas contendo apenas espaços em branco:

sed '/^[[:space:]]*$/d'

Uma versão mais curta que usa o ERE, por exemplo, com o gnu sed:

sed -r '/^\s*$/d'

(Note que sed não suporta PCRE.)





sed