sed - Eliminando linhas em branco

Publicado por Perfil removido em 18/10/2016

[ Hits: 22.298 ]

 


sed - Eliminando linhas em branco



A dica é sobre eliminação de linhas em branco de arquivos com o comando sed.

Seja "arquivo.txt", um arquivo de texto com várias linhas, sendo algumas não aparentando ter caracteres.

A expressão regular para representar um carácter que se aparenta como branco é [\s\t].

Sendo:
  • \s :: representa um espaço em branco
  • \t :: representa uma tabulação

De modo que agora, é só encaixar no comando sed:

Exemplos de duas regex de avaliação:

sed -r '/^[\s\t]*$/d'
sed -r '/^[\s\t]+$/d'

Explicando:
  • ^ :: marca o reconhecimento do espaço avaliado para partir do começo da linha;
  • [\s\t] :: representa um carácter que pode ser um espaço em branco ou uma tabulação;
  • * :: representa o número de caracteres em branco e tabulação que podem ser pegos, sendo entre zero e inúmeros;
  • + :: representa o número de caracteres em branco e tabulação que podem ser pegos, sendo entre um e inúmeros;
  • :: marca o reconhecimento do espaço avaliado para ir até o final da linha;
  • / ... / :: dentro deste par de barras é onde fica escrita toda a regex;
  • d :: é o comando do sed que faz apagar a linha.

O primeiro comando sed faz apagar até as linhas vazias. O segundo faz apagar apenas as linhas que contenham algum dos caracteres "\s" e "\t".

A opção "-r" faz com que o sed reconheça um determinado conjunto de regex e evita que metacaracteres tenham que ser escritos com contra-barra "\".

O arquivo de exemplo pode ser enviado pelo comando cat ou aberto pelo próprio sed. Três exemplos:

$ cat arquivo.txt | sed -r 'comando' > arquivo2.txt
$ sed -r 'comando' arquivo.txt > arquivo2.txt
$ sed -r 'comando' -i arquivo.txt


O primeiro comando possui cat, que faz um pipe "|" que faz o conteúdo de "arquivo.txt" entrar pela entrada padrão ao comando sed, cuja saída iria para a tela se não fosse o redirecionador ">" que faz o conteúdo ir para o arquivo "arquivo2.txt".

O segundo comando faz o conteúdo de "arquivo.txt" ser lido diretamente por sed, cuja saída iria para a tela se não fosse o redirecionador ">" que faz o conteúdo ir para o arquivo "arquivo2.txt".

O terceiro comando faz o conteúdo de "arquivo.txt" ser lido diretamente por sed, cuja saída será uma modificação diretamente feita como edição em "arquivo.txt" graças à opção "-i", deixando este de ter os espaços anteriores.

A marcação que aparece como 'comando' nos três exemplos do comando sed, é nada menos que um dos dois exemplos de regex feitos anteriormente.

Se usar sed parece muito difícil, fica aqui como extra a dica de que é possível usar o comando grep:

grep -v '^[\s\t]*$' arquivo.txt

A opção "-v" do comando grep faz a rejeição de tudo o que se encaixe na expressão regular. Basta usar um redirecionador ">" ou ">>" para que a filtragem seja redirecionada para um arquivo-destino.

Bem, é isto.

Outras dicas deste autor

LXDE - ambiente gráfico perfeito para computador antigo

Como instalar o Netbeans em formato .sh [Vídeo]

Resolvendo travamentos sem desabilitar ACPI nos Notebooks HP/Compaq

Otimizando seu Linux com o prelink (e uma mãozinha do Kurumin)

Busca de imagens no Google não abre corretamente no Firefox [Resolvido]

Leitura recomendada

Redirecionamento no Shell

Como remover parêntesis dos nomes de arquivos

Listar comandos mais utilizados (via histórico de shell)

Eliminando linhas de comentário ou linhas em branco no Linux

Como fazer "quit" no SED

  

Comentários
[1] Comentário enviado por baixinho930 em 20/01/2017 - 10:11h

Ola tudo bem, tenho uma duvida pode me ajudar.

Tenho 2 arquivos lista1.txt e lista2.txt com algumas linhas ex:

lista1.txt

daniel_29anos_branco
julio_22anos_azul
tulio_38anos_amarelo

lista2.txt
julio_caixa4_144
tulio_caixa9_89
daniel_caixa71_76


Gostaria de saber se existe um comando para recortar as linhas da lista2.txt e adicionar na lista1.txt ficando assim:

lista1.txt

daniel_29anos_branco daniel_caixa71_76
julio_22anos_azul julio_caixa4_144
tulio_38anos_amarelo tulio_caixa9_89

adicionar pelo mesmo nome na mesma linha seria possivel ?

Grato.



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts