Pular para o conteúdo

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.
jarlisson moreira jarlisson
Hits: 87.991 Categoria: Shell Script Subcategoria: Introdução
  • Indicar
  • Impressora
  • Denunciar
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.

Parte 3: 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!

O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
O Viva o Linux depende da receita de anúncios para se manter. Ative os cookies aqui para nos patrocinar.
Não conseguimos carregar os anúncios. Se usa bloqueador, considere liberar o Viva o Linux para nos patrocinar.
   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

AWK - Introdução

LibreOffice Math

Processos

Pipelines (Canalizadores)

Shell - Funções

O que é Shell Script

Colorindo o Shell

Criando um banner em flash no Linux

Monitoramento automático de logs e alertas por e-mail - Fácil e explicado

Slackware - Script de instalação de programas

#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

Entre na sua conta para comentar.