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!