sed, parte IV: Substituindo

parte I: O que é e para que serve
parte II: Enviando dados pro sed
parte III: Selecionando as linhas em que vamos trabalhar
parte IV: Substituindo
parte V: Scripts em sed
parte VI: Expressões Regulares
parte VII: Referenciando com &
parte VIII: Back Reference
parte IX: Hold Space ou Espaço Reserva
parte X: Por onde prosseguir e Considerações Finais
parte XI: Comandos de uma linha só




Essa é uma das funções mais importante 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 'substituia_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 javali vem de roxo quando pisca na inconsciência do javali

Obviamente, essa 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 exercicio, 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çao para o arquivo 'output'
  • i ou I           pra substituição ser caso-insensitivo(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 alterarmos um endereço '/etc' por '/dev' podemos fazer:
's/\etc/\/dev/'

Pois, pra usar o '/' como caractere, devemos colocar '\' antes.

Ou substituir o sepador. 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.
Pra 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. Pra 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 na 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/duendete/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 '. O comando só é completo quando houverem dois '. 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!

2 comentários:

suporte sesin disse...

Cara sepost me ajudou bastante! Muito obrigado!

suporte sesin disse...

Obrigado cara, seu post me ajudou bastante.

Veja também: