Fundamentos da substituição com sed

LinuxBeginner
Pratique Agora

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:

  1. Substituir texto (s): realizar operações básicas de localização e substituição.
  2. Fazer substituições globais (g): substituir todas as ocorrências de um padrão em uma linha, não apenas a primeira.
  3. Usar delimitadores personalizados: lidar com textos que contêm barras, como caminhos de arquivos, usando delimitadores alternativos.
  4. 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:

  1. echo envia “Hello World” para a saída padrão.
  2. O pipe | passa essa saída para o sed.
  3. O sed lê 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:

  1. Substituição (s///): o comando padrão para localizar e substituir texto.
  2. Sinalizador global (g): substituir todas as ocorrências de um padrão em uma linha.
  3. Delimitadores personalizados: usar caracteres como # para lidar com segurança com caminhos e URLs que contêm /.
  4. 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.