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: 69.871 ]

Por: jarlisson moreira em 16/07/2012


Substituindo



Esta é uma das funções mais importantes do sed, substituir um trecho de texto por outro.

O modelo de comando para substituir uma coisa por outra é: s/substitua_isso/por_isso/

A substituição será feita na primeira ocorrência de 'substitua_isso' na LINHA.

Se quiser que a substituição ocorra em todas as ocorrências em uma linha, use a flag "g", ao final de 's///': s/substitua_isso/por_isso/g

Vamos testar. Crie o arquivo: frase.txt

Escreva nele: O vento do duende vem de roxo quando pisca na inconsciência do javali

Obviamente, esta frase não faz o menor sentido. Mas fará com a seguinte alteração:

cat frase.txt | sed 's/javali/duende/'

Pois ela substituirá a primeira ocorrência de 'javali' e irá substituir por 'duende'.

Caso nunca tenha estudado expressões regulares, '^' se refere ao início da linha e '$' ao final.

Teste:

cat frase.txt | sed 's/^/INICIO/'
$ cat frase.txt | sed 's/$/FIM/'


Como exercício, coloque um ponto final ao fim da frase, de duas maneiras diferentes.

Outras flags de substituição:
  • NUMERO :coloque um numero ao final de s/// para especificar o número da ocorrência a ser substituída
  • p :mostra o que foi substituído
  • w output :o 'w' é de escrever. Ou seja, manda o que resultado da substituição para o arquivo 'output'
  • i ou I :para substituição ser case-insensitive (não importa se é maiúsculo ou minúsculo)
  • m ou M :faz com que a '^' reconheça uma string vazia após a newline e uma vazia antes do '$'

Outros separadores

Se quisermos alterar um endereço "/etc" por "/dev", podemos fazer: s/\etc/\/dev/

Pois, para usar o "/" como caractere, devemos colocar "\" antes.

Ou substituir o separador. Não é obrigado o uso de "/", no "s///".

Podemos usar ":" e teríamos "s:::". Ficaria: s:/etc:/dev:

Apagando

Apagar, em suma, é substituir uma coisa por nada.

Para apagar 'javali' de nossa frase, fazemos:

cat frase.txt | sed 's/javali//'

Ou seja, trocamos 'javali' por nada. Embora saibamos que sem o javali a frase não fará o menor sentido.

Substituição através de endereços

Assim, o comando deletar 'd', podemos agir especificamente em uma linha. Para isso, basta dizer qual linha se quer atuar. Por exemplo, vamos substituir o número 3, da linha 3 no teste.txt, por 2112:

cat teste.txt | sed '3s/10/2112/'

Analogamente, poderíamos usar um intervalo de endereços ou endereços em PA.\

Vamos colocar "0" antes de cada número:

cat teste.txt | sed '1,6s/^/0/'

Múltiplas edições

De volta à nossa frase: "O vento do duende vem de roxo quando pisca na inconsciência do javali".

Se quisermos substituir 'duende' por 'gnomo' e 'javali' por 'porco', não precisamos usar dois comandos de sed:

cat frase.txt | sed 's/duende/gnomo/'
$ cat frase.txt | sed 's/javali/porco/'


Podemos fazer:

cat frase.txt | sed 's/duende/gnomo/ ; s/javali/porco/'

Ou seja, apenas separamos os comandos de substituição por meio de ponto e vírgula. Como está tudo entre ' ', é como se fosse um comando só.

Outra forma é através da flag "-e", que se refere a múltiplos comandos:

cat frase.txt | sed -e 's/duende/gnomo/' -e 's/javali/porco/'

Outra forma, mais organizada e clara, de fazer múltiplas edições é utilizando o bash, que sabe quando ainda não terminamos de digitar os comandos. Ele sabe disso por conta do ' (aspas). O comando só é completo quando houverem dois ' (aspas).

Veja:

cat frase.txt | sed 's/duende/gnomo/ [ENTER]
s/javali/porco/ [ENTER]
' [ENTER]

O sed só roda depois do último ENTER.

É interessante se utilizar dessa terceira maneira quando seus comandos forem ficando grandes e complexos. Sábio bash!

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

Processos

Shell - Funções

LibreOffice Math

Pipelines (Canalizadores)

AWK - Introdução

Leitura recomendada

Programando em shell script (conceitos básicos)

Introdução a LUA, uma poderosa linguagem de programação

Trabalhar com array no Bash

Mini-tutorial Shell

Variáveis, if, else e unless em Ruby

  
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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts