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:
Cara sepost me ajudou bastante! Muito obrigado!
Obrigado cara, seu post me ajudou bastante.
Postar um comentário