Linux / Comando sed: substituir texto e editar com backup
sed é um editor de fluxo: lê texto, aplica regras e envia o resultado à saída padrão, normalmente o terminal. Para substituir a primeira ocorrência de red em cada linha, use sed 's/red/green/' arquivo; acrescente g para substituir todas as ocorrências na mesma linha. A execução comum preserva o arquivo de entrada.
O programa também seleciona ou exclui linhas da saída e pode receber dados de um pipe, sem um arquivo como argumento. Uma expressão regular é um padrão de busca com regras próprias, não necessariamente um texto literal. Os exemplos seguintes separam o padrão, a substituição e os cuidados para salvar alterações.
Sintaxe e implementação
sed [opção...] 'comando de edição' [arquivo...]
A linha acima descreve a sintaxe; os marcadores precisam ser substituídos antes de executar. Confira sed --version, sed --help ou man sed para identificar a implementação. O bloco de prática usa Bash e GNU sed, inclusive a forma -i.bak para editar com backup; verifique a sintaxe de -i nas versões BSD e em outras implementações.
A substituição tem a forma s/padrão/substituição/flags. Sem g, a primeira correspondência é trocada em cada linha, e não apenas na primeira linha do arquivo. Linhas sem correspondência continuam na saída padrão. Use aspas simples ao redor desses programas fixos para impedir que o shell interprete seus caracteres antes de sed.
Comparar original, saída, backup e restauração
Execute o bloco inteiro no Bash, em uma pasta onde possa criar arquivos. Ele cria um diretório exclusivo dentro dela, prepara todos os dados e trabalha em um subshell entre parênteses. set -eu interrompe este bloco simples diante de falhas não tratadas ou de variáveis não definidas; ao terminar, a sessão retorna à pasta anterior.
(
set -eu
labdir=$(mktemp -d ./sed-demo.XXXXXX)
cd "$labdir"
printf 'red car\nred red\n' > config.txt
sed 's/red/green/' config.txt > first.txt
sed 's/red/green/g' config.txt > all.txt
cat config.txt first.txt all.txt
cp config.txt editable.txt
sed -i.bak 's/red/green/g' editable.txt
diff -u editable.txt.bak editable.txt || test "$?" -eq 1
cmp config.txt editable.txt.bak
cp editable.txt.bak editable.txt
cmp config.txt editable.txt
printf 'Arquivos do laboratório: %s\n' "$PWD"
)
O primeiro cat mostra três pares de linhas, nesta ordem: original red car e red red; primeira substituição green car e green red; substituição global green car e green green. Compare cada par com config.txt, first.txt e all.txt, respectivamente.
Depois, sed -i.bak altera apenas editable.txt e conserva o conteúdo anterior em editable.txt.bak. O comando diff mostra as duas linhas alteradas; seu status 1 indica diferenças e é tratado por || test "$?" -eq 1. Outros erros de diff não são aceitos como uma comparação normal.
Os dois comandos cmp não imprimem nada quando há igualdade: o primeiro verifica o backup e o segundo confirma a restauração de editable.txt. Ao final, config.txt continua original, first.txt e all.txt guardam as duas saídas, e o backup permanece disponível. A última linha mostra o caminho completo da pasta de prática; entre nele com cd e aspas para continuar os exemplos.
Esse bloco e os exemplos de transformação foram conferidos com GNU sed 4.9 no Bash do Git para Windows, usando arquivos locais com finais de linha LF. Essa verificação cobre os textos e a restauração demonstrados; confira permissões e comportamento de arquivos no seu ambiente antes de aplicar a edição a dados reais.
Selecionar linhas e controlar a impressão
Na pasta criada, sed -n '2p' config.txt mostra somente red red, a segunda linha. A opção -n desliga a impressão automática; o comando p imprime a linha selecionada. Sem -n, sed '2p' config.txt mostra a primeira linha uma vez e a segunda duas vezes, pois soma impressão explícita e automática.
Para selecionar um intervalo, sed -n '1,2p' config.txt mostra as duas linhas. Para excluir a primeira linha da saída, sed '1d' config.txt mostra apenas red red. O comando d exclui o texto do processamento daquela linha; sem -i, isso não apaga a linha do arquivo original.
Uma seleção pelo conteúdo também é possível: sed -n '/car/p' config.txt mostra red car. Já sed -n 's/red/green/gp' config.txt mostra somente as linhas em que houve substituição, após a transformação. O p junto à substituição e o -n têm funções diferentes.
Distinguir padrões, caracteres especiais e delimitadores
No padrão, o ponto corresponde a um caractere. Compare printf 'a.b axb\n' | sed 's/a.b/X/g', que produz X X, com printf 'a.b axb\n' | sed 's/a\.b/X/g', que produz X axb. A barra invertida faz o ponto ser tratado literalmente nesse padrão.
Na substituição, & representa todo o texto encontrado. Por exemplo, printf 'red\n' | sed 's/red/[&]/' produz [red]. Para escrever um ampersand literal, printf 'red\n' | sed 's/red/\&/' produz &. Aspas do shell não removem o significado que esses caracteres têm para sed.
O delimitador não precisa ser uma barra. printf '/old/path\n' | sed 's#/old/#/new/#' produz /new/path. Escolha um delimitador que facilite a leitura; se ele aparecer no padrão ou na substituição, ainda precisará ser escapado. Não monte programas de sed com valores arbitrários sem tratar os caracteres do padrão e da substituição.
Com -E, sed usa expressões regulares estendidas. Por exemplo, printf 'item=12\n' | sed -E 's/([0-9]+)/[\1]/' produz item=[12]: os parênteses capturam os dígitos, e \1 reutiliza esse grupo na substituição. Trocar o modo de expressão regular exige conferir o padrão, pois a sintaxe de operadores e grupos muda.
Aplicar mais de uma regra na ordem certa
Use uma opção -e para cada regra. Na mesma entrada, sed -e 's/red/green/g' -e 's/green/blue/g' config.txt produz blue car e blue blue. A segunda regra recebe o resultado da primeira na linha atual. Inverter essas duas regras produz green car e green green, porque a busca por green acontece antes da transformação de red.
Para ler de um pipe, printf 'red red\n' | sed 's/red/green/g' mostra green green. Quando não há argumento de arquivo, sed lê a entrada padrão. Confira sempre se o programa que envia os dados usa as quebras de linha e a codificação esperadas para o texto que será tratado.
Salvar alterações e conferir o resultado
Comece examinando a saída, como no bloco inicial, e salve em outro arquivo ao usar redirecionamento. Não use o mesmo caminho como entrada de sed e destino de >: o shell pode esvaziá-lo antes de sed ler os dados. Para repetir um teste, escolha um nome de saída ainda não usado ou faça uma cópia independente da entrada.
No GNU sed, escreva o sufixo junto da opção: -i.bak cria o backup com esse sufixo. Revise as diferenças antes de aceitar o resultado ou restaurar a cópia. Uma nova edição com o mesmo nome de backup pode substituir o backup anterior; reserve uma cópia separada quando precisar conservar mais de uma versão.
Confira com atenção a combinação de -n e -i. Se o programa não imprimir nada, o conteúdo gravado pode ficar vazio, mesmo que o comando termine com sucesso. Use -n para selecionar a saída conscientemente e teste sem -i antes de alterar o arquivo.
Após uma execução isolada, consulte echo "$?" imediatamente se precisar conferir o status. Nos exemplos GNU, um programa de sed válido pode terminar com 0 mesmo sem encontrar o padrão. Portanto, sucesso da execução não prova que a alteração pretendida ocorreu; examine a saída e compare o conteúdo. Trate diagnósticos de expressão inválida ou de arquivo ausente como falhas.
Opções principais
| Opção | Uso |
|---|---|
-n |
Desliga a impressão automática; use p ou outra saída explícita quando necessário. |
-e programa |
Acrescenta uma regra de edição; as regras são aplicadas na ordem indicada. |
-E |
Ativa expressões regulares estendidas. |
-i[sufixo] |
No GNU sed, edita o arquivo; o sufixo opcional cria um backup. Confira a sintaxe em outras implementações. |
Pergunta frequente
Executar sed altera o arquivo original?
A execução comum lê a entrada e envia o resultado à saída padrão. A opção -i altera o arquivo; um redirecionamento grava no destino escolhido pelo shell. Para experimentar, use os arquivos exclusivos do bloco de prática, compare o conteúdo e preserve uma cópia antes de aplicar mudanças aos seus dados.
Documentação
Consulte o manual oficial do GNU sed para detalhes de substituição, impressão e edição com backup. A página de manual do GNU sed publicada pelo Debian também reúne as opções e os comandos.




