Estou tentando excluir linhas vazias usando sed:
sed '/^$/d'
mas 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?
Estou tentando excluir linhas vazias usando sed:
sed '/^$/d'
mas 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?
Respostas:
Você pode ter espaços ou tabulações na sua linha "vazia". Use as classes POSIX com sed
para remover todas as linhas que contêm apenas espaço em branco:
sed '/^[[:space:]]*$/d'
Uma versão mais curta que usa ERE, por exemplo, com o gnu sed:
sed -r '/^\s*$/d'
(Observe que o sed NÃO suporta PCRE.)
-r
sed -i "" '/^[[:space:]]*$/d'
<filename>
,
^\s*$
corresponderá a todas as linhas "vazias". Vazio aqui significa, a linha não contém caracteres ou a linha contém apenas cadeias vazias (por exemplo, espaços). Todas as linhas correspondentes serão removidas pelo sed, com o d
comando
Estou faltando a awk
solução:
awk 'NF' file
O que retornaria:
xxxxxx
yyyyyy
zzzzzz
Como é que isso funciona? Como NF
significa "número de campos", essas linhas vazias têm 0 campos, de modo que o awk avalia 0 como Falso e nenhuma linha é impressa; no entanto, se houver pelo menos um campo, a avaliação será True e awk
executará sua ação padrão: imprima a linha atual.
$ time (topic companies <data.tpx | awk 'NF' - | awk -f dialog_menu.awk -)
real 0m0.006s
user 0m0.000s
sys 0m0.008s
$ time (topic companies <data.tpx | gsed '/^\s*$/d' | awk -f dialog_menu.awk -)
real 0m0.014s
user 0m0.002s
sys 0m0.006s
você saberia uma maneira bacana de incluir isso em um script do awk como, por exemplo, um padrão? awk '/ mypattern / {do stuff ...}' '
awk 'NF {do stuff...}'
.
sed '/^$/d'
deve ficar bem, você espera modificar o arquivo no lugar? Nesse caso, você deve usar a -i
bandeira.
Talvez essas linhas não estejam vazias, portanto, se for esse o caso, observe esta pergunta Remova as linhas vazias dos arquivos txtfiles, remova espaços do início e do fim da linha . Acredito que é isso que você está tentando obter.
sed -i '/^$/d'
é uma maneira de fazer isso.
[]
devem ser escapados em uma expressão entre colchetes; portanto, o código aqui não está correto ou - deve ser e . \[\[:space:\]\]
\[ \t\]
[[:space:]]
[ \t]
Eu acredito que este é o mais fácil e rápido:
cat file.txt | grep .
Se você precisar ignorar todas as linhas de espaço 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
cat
, grep
leva arquivos também:grep . file.txt
grep '\S'
definitivamente não é portátil. Se você tiver grep -P
, poderá usar, grep -P '\S'
mas também não é suportado em todas as plataformas.
grep .
comparação com as outras soluções é que destacará todo o texto em vermelho. As outras soluções podem preservar as cores originais. Compare unbuffer apt search foo | grep .
comunbuffer apt search foo | grep -v ^$
Com a ajuda da resposta aceita aqui e a resposta aceita acima, usei:
$ sed 's/^ *//; s/ *$//; /^$/d; /^\s*$/d' file.txt > output.txt
`s/^ *//` => left trim
`s/ *$//` => right trim
`/^$/d` => remove empty line
`/^\s*$/d` => delete lines which may contain white space
Isso cobre todas as bases e funciona perfeitamente para minhas necessidades. Parabéns aos pôsteres originais @Kent e @kev
Isso funciona no awk também.
awk '!/^$/' file
xxxxxx
yyyyyy
zzzzzz
Você provavelmente está vendo um comportamento inesperado porque seu arquivo de texto foi criado no Windows; portanto, a sequência de fim de linha é \r\n
. Você pode usar o dos2unix para convertê-lo em um arquivo de texto no estilo UNIX antes de executar o sed ou usar
sed -r "/^\r?$/d"
para remover linhas em branco, independentemente de o retorno de carro estar lá.
-r
bandeira está fazendo e é possível combiná-la -i
para modificar o arquivo diretamente e evitar a impressão na tela. Além disso, eu acho que este comando também funcionaria comosed -r "/^\r$/d"
Outra opção sem sed
, awk
, perl
, etc
strings $file > $output
strings - imprime as strings de caracteres imprimíveis nos arquivos.
strings
vez de string
?
Minha bash
resposta específica é recomendar o uso do perl
operador de substituição com o g
sinalizador de padrão global para isso, da seguinte maneira:
$ perl -pe s'/^\n|^[\ ]*\n//g' $file
xxxxxx
yyyyyy
zzzzzz
Esta resposta ilustra como contabilizar se as linhas vazias têm ou não espaços ( [\ ]*
), além de usar |
para separar vários termos / campos de pesquisa. Testado no macOS High Sierra e CentOS 6/7.
Para sua informação, o código original do OP sed '/^$/d' $file
funciona perfeitamente no bash
Terminal no macOS High Sierra e no CentOS 6/7 Linux em um cluster de supercomputação de alto desempenho.
Para mim, o FreeBSD 10.1 com o sed funcionou apenas nesta solução:
sed -e '/^[ ]*$/d' "testfile"
dentro, []
há 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 =============