Sed - Introdução

Introdução ao Sed, por meio de exemplos, cobrindo os tópicos: enviando dados pro sed, selecionando as linhas para edição, substituição, scripts em sed, expressões regulares, referências por &, back reference, hold space/ espaço reserva, dicas de comandos, jogos, exemplos e material para prosseguir nos estudos sobre Sed.

[ Hits: 84.832 ]

Por: jarlisson moreira em 16/07/2012


Expressões regulares



Este artigo tem assunto para livros e livros, pois, sem dúvida, é a ferramenta mais útil e utilizada para quem quer processar informações na forma de texto.

Há muita, mas muita coisa na Internet, que podem facilitar muito a vida de quem precisa trabalhar com sed, AWK, Perl e outras linguagens que façam uso de expressão regular, pois não existe uma regra geral de escrita, varia muito de acordo com a criatividade de quem escreve.

Existem até competições minimalistas, pra ver quem consegue fazer um mesmo trabalho utilizando de expressões regulares mínimas.

Se for pesquisar algo e em inglês, ela é muito conhecida por regex (regular expressions). Para mais informações, veja a última parte deste artigo.

Expressões regulares são, basicamente, um conjunto de caracteres. Mas esse conjunto pode representar muitas coisas, e de uma maneira bem simples (às vezes não).

Já conhecemos dois elementos, " ^ " e " $ ". Vamos usar o que sabemos pra fazer algo.

Vamos supor que você tornou-se moderador do VOL, e terá que analisar muitos scripts que são enviados todos os dias e existem sempre aquelas pessoas que comentam demais ou gostam de deixar recados pra namorada, tipo "agora vamos somar", "agora vamos testar a condição", "RoSy te Amuh bjos by Cachorrao-Raquer@vidaloka.com".

Como você faria pra eliminar os comentários?

Lembrando que sempre começam com '#' no início da linha.

A regex pra isso é : ^#

Vamos usar o arquivo syslog.conf (se não tiver, tente o sysctl.conf), como exemplo:

cat /etc/syslog.conf | sed '/^#/d'

Você poderia ter usado "s/^#//" , mas aí teria digitado 's' e '/' à toa. Mas, mais importante do que fazer da maneira mais simples, é conseguir fazer. Com o tempo, e preguiça, você vai digitando cada vez menos.

Suponha agora que você quer transformar uma linha em branco de seu editor em texto em '<p>', que é o parágrafo em HTML. Uma linha em branco nada mais é que: ^$

Ou seja, nada entre o começo e o fim. Faz todo o sentido, né?

cat txt2html | sed 's/^$/<p>/g'

Pronto. Com isso e com o comando "i" e "a", já pode iniciar um soft que converte seu arquivo de texto em código HTML. ;)

* Falei sério.

Com o uso da flag 'd' de delete, vemos somente o que restou. Sempre que quisermos ver o que o casou ("matched"), use as flags '-n' e 'p':

cat /etc/syslog.conf | sed -n '/^#/p'

Outros caracteres usados em regex:
  • .   :Pode substituir qualquer caractere: p.p casa tanto com 'psp', um PlayStation portável ou um palavrão abreviado.
  • *   :Casa com qualquer quantidade do caractere anterior. No caso de 'p.p', só casa com 3 caracteres. Se fosse 'p.*p', casa qualquer coisa que comece com p e termine com p, inclusive 'pp' ou o palavrão na forma formal.
  • []   :Casa com qualquer caractere dentro desses colchetes. Por exemplo, quer testar se alguma linha do arquivo começa com as letras 'a', 'b' ou 'c': ^[abc]. Se usar '-', você define uma faixa : [a-z], de 'a' até 'z', ou [0-9]: de 0 até 9

Classe de caracteres

Em vez de escrevermos [a-z], [A-Z], [0-9]...elas já vêm em forma de classes pré-definidas, pois são de uso corriqueiro por quem usa regex.

Por exemplo: Quer saber que linhas de um arquivo começam por um caractere alfabético?

cat /etc/sysctl.conf | sed -n '/^[:alpha:]/p'

E o que fica se você apagar tudo que não começa por um caractere alfabético? Veja:

cat /etc/sysctl.conf | sed '/^[:alpha:]/d'

A seguir, a lista completa das classes de caracteres do GNU sed:
  • [[:alnum:]]   Alfabéticos e númericos [a-z A-Z 0-9]
  • [[:alpha:]]   Alfabéticos [a-z A-Z]
  • [[:blank:]]   Caractere em branco, espaço ou tab [ \t]
  • [[:cntrl:]]   Caracteres de controle [\x00-\x1F\x7F]
  • [[:digit:]]   Números [0-9]
  • [[:graph:]]   Qualquer caractere visível(ou seja, exceto em branco) [\x20-\x7E]
  • [[:lower:]]   Letras minúsculas [a-z]
  • [[:upper:]]   Letras maiúsculas [A-Z]
  • [[:print:]]   Caracteres visíveis (ou seja, exceto os de controle) [\x20-\x7E]
  • [[:punct:]]   Pontuação [-!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~].
  • [[:space:]]   Espaço em branco [ \t\r\n\v\f]
  • [[:xdigit:]]  Número hexadecimais [0-9 a-f A-F]

Expressões regulares em intervalos de endereços

Vimos um exemplo de endereços usando a numeração das linhas.

Mas raramente sabemos disso. Na real, o texto terá dezenas, centenas ou milhares de linhas, e você não faz a mínima ideia de qual o número da linha de determinada informação.

Reescreva a "frase.txt", como:

O vento do duende
vem de roxo
quando pisca
na inconsciência
do javali.

Em vez de usar números para definir linhas, podemos tentar casar uma parte do texto. Por exemplo, vamos exibir da segunda até a quarta linha.

cat frase.txt | sed -n '/vem de roxo/,/na inconsciência/p'

Note que:
  • /vem de roxo/ = linha 2
  • /na inconsciência/ = linha 4

Assim, não precisamos nos importar com a numeração, e sim com um texto que podemos casar.

Então, o sed acha as linhas e procede automaticamente.

Para o sed, '2' e '/vem de roxo/' são a mesma coisa. Então, podemos fazer:

cat frase.txt | sed -n '2,/na inconsciência/p'

Substituições com expressões regulares, são, sem dúvida, a combinação mais poderosa do sed.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução - o que é e para que serve
   2. Enviando dados para o sed
   3. Substituindo
   4. Scripts em sed
   5. Expressões regulares
   6. Referenciando com & - Back reference
   7. Hold space
   8. Por onde prosseguir e considerações finais
Outros artigos deste autor

AWK - Introdução

Shell - Funções

LibreOffice Math

Pipelines (Canalizadores)

Processos

Leitura recomendada

Discar BrasilTelecom com PPPOE no Ubuntu 6.10

Simples e rápido: matando todos os processos de um usuário

Programar em Shell - Script só para os baixinhos

Variáveis, if, else e unless em Ruby

Backup automático em Shell Script

  
Comentários
[1] Comentário enviado por eldermarco em 16/07/2012 - 10:53h

Muito bom! Super bem escrito e bastante didático, exatamente como o artigo sobre o AWK que você escreveu. Nota 10!

[2] Comentário enviado por removido em 16/07/2012 - 12:42h

i like too!

[3] Comentário enviado por eduardo em 16/07/2012 - 14:13h

Ótimo artigo! Parabéns! Acabei de perceber que uso menos de 5% do poder do sed. :)

[4] Comentário enviado por sir.guil em 16/07/2012 - 15:05h

Parabéns, era uma coisa que faltava aqui no vol,

sempre que precisei estudar o sed, dependi do http://aurelio.net/sed/

agora estamos + completos

[5] Comentário enviado por julio_hoffimann em 16/07/2012 - 17:56h

Novamente parabéns Jarlisson!

Artigos bastante claros que ajudarão muitos no VOL.

Abraço!

[6] Comentário enviado por marcelo.castro.l em 17/07/2012 - 08:10h

Cara, muito bom esse artigo.
Salvou minha pátria aqui na empresa.
Precisava manipular um arquivo gerado pelo:

#iptables -L

Porém não precisava dele formatado com os espaços, graças ao "sed" tudo fluiu perfeitamente.

Obrigado!

[7] Comentário enviado por H4cktz em 19/02/2019 - 12:09h

Muito bom! Super bem escrito e bastante didático, Nota 1000! Finalmente estou aprendendo SED!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts