Comando SED: substituição de texto no Linux

2017-11-29

Neste post segue uma pequena explicação e exemplos de utilização do comando SED para substituição de texto no terminal do Linux.

O que é o comando SED?

O comando SED(stream editor) é um editor de texto não interativo para o terminal do Linux. Com ele podemos editar o conteúdo de arquivos automaticamente através do terminal, como por exemplo substituir textos, apagar linhas, traduzir caracteres, entre outras tarefas.

Substituindo texto

Para a substituição de texto, utilizamos o comando 's/busca/substituição/'. No exemplo abaixo, a palavra limão é substituida por laranja:

$ echo "Eu gosto de suco de limão." | sed 's/limão/laranja/'
Eu gosto de suco de laranja.

No exemplo anterior, modificamos uma palavra da entrada padrão por outra, podemos realizar a mesma operação com arquivos. Exemplo:

# criamos o arquivo para o teste
$ echo "Eu gosto de suco de limão." > suco.txt

# executamos o sed com a substituição
$ sed 's/limão/laranja/' suco.txt
Eu gosto de suco de laranja.

O conteúdo da substituição é exibido após a execução do comando, porém o conteúdo do arquivo não foi alterado. Para alterar o conteúdo do arquivo, usamos a opção abreviada -i ou --in-place. Exemplo:

$ sed -i 's/limão/laranja/' suco.txt
# neste caso o conteúdo não é exibido após a execução 

# imprimindo o arquivo vemos a substituição
$ cat suco.txt
Eu gosto de suco de laranja.

No exemplo anterior o conteúdo do arquivo foi alterado, mas tenha cuidado ao usar a opção -i, porque ela sobescreve o conteúdo do arquivo.

Por esta razão existe um parâmetro adicional a opção -i que cria um arquivo de backup. O parâmetro é o seguinte -i[SUFIXO] ou --in-place[=SUFIXO]. Exemplo:

$ sed -i.bkp 's/laranja/limão/' suco.txt

# ao listar a pasta, vemos o arquivo alterado e o de backup
$ ls
suco.txt suco.txt.bkp

# imprimindo o arquivo alterado
$ cat suco.txt
Eu gosto de suco de limão.

# imprimindo o arquivo de backup
$ cat suco.txt.bkp
Eu gosto de suco de laranja.

Devemos salientar que o comando de substituição apresentado até o momento, substitui somente uma palavra por linha. Para substituir a mesma palavra mais de uma vez por linha, devemos usar o parâmetro /g. Exemplo:

# primeiro inserimos uma nova frase ao suco.txt com dois 'limão'
$ echo "Eu gosto de suco de limão e de picolé de limão." > suco.txt

# ao executar a substituição, vemos que só muda o primeiro 'limão'
$ sed 's/limão/laranja/' suco.txt
Eu gosto de suco de laranja e de picolé de limão.

# para substituir todas as ocorrências, usamos a opção '/g'
$ sed 's/limão/laranja/g' suco.txt
Eu gosto de suco de laranja e de picolé de laranja.

Expressões regulares

A porção de busca no comando de substituição, também pode ser uma expressão regular. Conforme os exemplos a seguir:

# criamos o arquivo para os testes
$ echo "Eu gosto de suco de limão e mamão. 1234567890" > teste.txt

# substituir limão por mamão e vice-versa
$ sed -i 's/\(limão\) e \(mamão\)/\2 e \1/' teste.txt ; cat teste.txt
Eu gosto de suco de mamão e limão. 1234567890

# substituir vogais 'o' ou 'u' por 'x'
$ sed -i 's/[ou]/x/g' teste.txt ; cat teste.txt
Ex gxstx de sxcx de limãx e mamãx. 1234567890

# substituir numeros pares por 0
$ sed -i 's/[2468]/0/g' teste.txt ; cat teste.txt
Ex gxstx de sxcx de mamãx e limãx. 1030507090

# substituir numeros impares por nada
$ sed -i 's/[13579]//g' teste.txt ; cat teste.txt
Ex gxstx de sxcx de mamãx e limãx. 00000

# substituir 3 primeiros caracteres por nada
$ sed -i 's/^...//g' teste.txt ; cat teste.txt
gxstx de sxcx de mamãx e limãx. 00000

# substituindo espaços por nada
$ sed -i 's/\s//g' teste.txt ; cat teste.txt
gxstxdesxcxdemamãxelimãx.00000

Concluindo

O comando sed possui muito mais possibilidades do que as mostradas aqui. Caso queira conhece-las, consulte o manual no terminal com o comando man sed ou info sed. Outra ótima fonte de consulta é o site do Aurelio Jargas sobre sed, o cara é o guru do sed.