Introdução
Uma tarefa comum de processamento de texto é “localizar e substituir”. Em processadores de texto, isso é feito de forma interativa. Em ambientes de linha de comando do Linux, o sed executa a mesma ideia de forma programável e não interativa.
O sed é um editor de texto não interativo que processa o texto linha por linha. Ele é especialmente poderoso para tarefas de substituição, nas quais você precisa substituir padrões específicos por um novo texto. Isso é útil na automação porque ninguém precisa ficar diante de um editor para repetir a mesma alteração várias vezes.
Neste laboratório, você aprenderá a:
- Substituir texto (
s): realizar operações básicas de localização e substituição. - Fazer substituições globais (
g): substituir todas as ocorrências de um padrão em uma linha, não apenas a primeira. - Usar delimitadores personalizados: lidar com textos que contêm barras, como caminhos de arquivos, usando delimitadores alternativos.
- Editar no próprio arquivo com backups: modificar arquivos com segurança, criando cópias de backup automaticamente.
Substituição básica
Vamos começar com uma substituição simples em uma cadeia de texto. Você alterará a palavra “World” para “Linux”.
O comando de substituição do sed é s.
A sintaxe é s/Pattern/Replacement/.
Esse formato de comando é tão comum que muitas pessoas consideram o sed uma “ferramenta de localizar e substituir”, mas ele é, na verdade, um editor de fluxo. A substituição é apenas um dos comandos de edição mais usados por ele.
Execute este comando para observar o funcionamento:
echo "Hello World" | sed 's/World/Linux/'
Como funciona:
echoenvia “Hello World” para a saída padrão.- O pipe
|passa essa saída para osed. - O
sedlê o texto, procura o padrão “World”, substitui-o por “Linux” e imprime o resultado.
Observação: este comando não modifica permanentemente a origem original; ele apenas exibe o texto modificado na tela (saída padrão).
Essa diferença é fundamental para uma edição segura na linha de comando. No estilo Unix, as ferramentas geralmente exibem primeiro um fluxo transformado, e só depois você decide se deseja salvar ou redirecionar o resultado.
Substituição global
Por padrão, o sed substitui apenas a primeira correspondência encontrada em cada linha.
Se você tiver o texto “apple apple” e substituir “apple” por “orange”, o sed exibirá “orange apple”.
Para substituir todas as ocorrências em uma linha, você precisa usar o sinalizador global (g) no final do comando de substituição.
O detalhe importante é “em cada linha”. O sed processa uma linha por vez, portanto o sinalizador g afeta todas as correspondências dentro da linha atual, e não o arquivo inteiro como um único bloco de texto.
Vamos verificar nosso arquivo de exemplo quote.txt:
cat quote.txt
Saída: I love Coding. Coding is fun.
Agora, tente substituir “Coding” por “Programming” sem o sinalizador global:
sed 's/Coding/Programming/' quote.txt
Resultado: I love Programming. Coding is fun.
Observe que a segunda ocorrência de “Coding” não foi substituída.
Agora adicione o sinalizador g:
sed 's/Coding/Programming/g' quote.txt
Resultado: I love Programming. Programming is fun.
Agora as duas ocorrências foram substituídas com sucesso.
Usar delimitadores diferentes
A sintaxe padrão do sed usa barras (/) como delimitadores: s/old/new/.
No entanto, se o texto que você está substituindo contiver barras, como um caminho de arquivo (/usr/local/bin), você precisará escapar cada barra com uma contrabarra. Isso torna o comando difícil de ler: s/\/usr\/local\/bin/\/bin/.
Felizmente, o sed permite usar quase qualquer caractere como delimitador. Algumas alternativas comuns são #, : e |.
Escolher um delimitador legível é uma habilidade prática, e não apenas um recurso de sintaxe. Quando os padrões contêm muitos caracteres /, alterar o delimitador torna o comando mais fácil de entender e reduz a possibilidade de erros.
Crie um arquivo contendo um caminho:
echo "/usr/local/bin" > path.txt
Agora substitua /usr/local/bin por /bin usando # como separador:
sed 's#/usr/local/bin#/bin#' path.txt
Resultado: /bin
Como usamos # como delimitador, o sed tratou os caracteres / do caminho como texto normal, deixando o comando mais limpo e fácil de ler.
Edição no próprio arquivo com backup
Até agora, o sed apenas exibiu as alterações na tela. Para modificar o arquivo diretamente (“no próprio arquivo”), usamos a opção -i.
No entanto, modificar arquivos diretamente pode ser arriscado. Se você cometer um erro no padrão, poderá perder dados. O ideal é criar um backup do arquivo original antes de modificá-lo.
Você pode fazer isso fornecendo uma extensão para a opção -i, como -i.bak.
Vamos modificar quote.txt e criar automaticamente um backup chamado quote.txt.bak.
sed -i.bak 's/fun/awesome/' quote.txt
Agora verifique o conteúdo do arquivo modificado:
cat quote.txt
Resultado: I love Coding. Coding is awesome.
Em seguida, confirme que o backup existe e contém o texto original:
ls -l quote.txt.bak
cat quote.txt.bak
Resultado: I love Coding. Coding is fun.
Essa é uma boa prática ao aplicar edições em lote a vários arquivos.
Esse hábito de criar backups é importante porque as edições não interativas são rápidas, mas não perdoam erros. Ao automatizar substituições de texto em vários arquivos, um pequeno erro no padrão pode se espalhar rapidamente; manter uma cópia original é uma forma simples de aumentar a segurança.
Resumo
Neste laboratório, você aprendeu os fundamentos da substituição de texto com sed:
- Substituição (
s///): o comando padrão para localizar e substituir texto. - Sinalizador global (
g): substituir todas as ocorrências de um padrão em uma linha. - Delimitadores personalizados: usar caracteres como
#para lidar com segurança com caminhos e URLs que contêm/. - Backup durante a edição no próprio arquivo (
-i.bak): modificar arquivos com segurança, preservando o conteúdo original.
Essas habilidades permitem automatizar tarefas complexas de processamento de texto de forma eficiente e segura.



