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.