sed - Eliminando linhas em branco

Publicado por Perfil removido em 18/10/2016

[ Hits: 22.394 ]

 


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

Como desativar o modo de "auto configuração de ganho" do microfone no Pulseaudio e no Pipewire

LightDM - Como exibir imagem de usuário na tela de login do Debian 8.7.1 (MATE)

Como um pinguin virou mascote oficial do Linux

O que é Linux

Logando pelo GDM como root

Leitura recomendada

Testando se uma variável é número em shell script

Obtendo a cotação do Bitcoin com SED

Exibindo o nome completo dos pacotes instalados no Debian e derivados

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

Busca por string dentro dos arquivos

  

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