O comando sed (Stream Editor) é uma ferramenta poderosa do Linux para manipular texto de forma não interativa. Ele processa linhas de entrada (de arquivos ou pipes) aplicando operações como substituição, inserção, exclusão e muito mais. Nesta aula, vamos nos concentrar no uso básico de sed para substituições, entendendo como endereçar linhas específicas e utilizar flags para controlar o comportamento.

Dominar o sed é essencial para automatizar tarefas de edição de texto em scripts shell, processar logs, configurar arquivos e realizar transformações rápidas sem abrir um editor. A sintaxe enxuta e a capacidade de trabalhar com streams fazem dele um aliado indispensável no terminal.

Substituição (s///)

O comando mais comum do sed é a substituição, usando a sintaxe s/ padrão / substituição /. O sed procura por um padrão (expressão regular) em cada linha e substitui a primeira ocorrência encontrada pelo texto de substituição. O separador tradicional é a barra (/), mas pode ser qualquer caractere (como # ou |) para evitar escapes.

Exemplo: substituir a primeira ocorrência de "foo" por "bar" em cada linha:

echo "foo foo foo" | sed 's/foo/bar/'

Saída: bar foo foo

O padrão pode ser uma expressão regular simples ou complexa, permitindo substituições avançadas. Por exemplo, substituir qualquer sequência de dígitos por "NUM":

echo "abc123def" | sed 's/[0-9]\+/NUM/'

Saída: abcNUMdef

Flags (g, i)

As flags modificam o comportamento do comando s///. As mais importantes são:

  • g (global): substitui todas as ocorrências na linha, não apenas a primeira.
  • i (case-insensitive): ignora diferenças entre maiúsculas e minúsculas no padrão.

Exemplo com a flag g:

echo "foo foo foo" | sed 's/foo/bar/g'

Saída: bar bar bar

Exemplo com a flag i:

echo "Foo FOO foo" | sed 's/foo/bar/gi'

Saída: bar bar bar

É possível combinar flags, como gi para global e insensível a maiúsculas.

Endereçamento de linhas

Por padrão, sed aplica o comando a todas as linhas. O endereçamento permite selecionar linhas específicas (por número, intervalo ou padrão). A sintaxe geral é [endereço] comando.

Exemplos:

  • Por número de linha: sed '3s/foo/bar/' substitui na linha 3.
  • Intervalo: sed '2,5s/foo/bar/' substitui nas linhas 2 a 5.
  • Por padrão: sed '/erro/s/foo/bar/' substitui apenas nas linhas que contêm "erro".
  • Negado: sed '/erro/!s/foo/bar/' substitui nas linhas que NÃO contêm "erro".

Exemplo prático: substituir "old" por "new" apenas nas linhas 10 a 20 de um arquivo:

sed '10,20s/old/new/g' arquivo.txt

Casos de uso

O sed é usado em inúmeras situações:

  • Substituição em massa: alterar URLs, nomes de variáveis ou palavras em arquivos de configuração.
  • Limpeza de dados: remover espaços extras, normalizar formatos (ex.: substituir quebras de linha).
  • Extração de informações: usar sed -n 's/.*\(padrão\).*/\1/p' para capturar partes específicas.
  • Transformação de logs: anonimizar IPs, substituir timestamps.
  • Automação em scripts: editar arquivos sem interação humana, ideal para pipelines.

Exemplo: extrair endereços de e-mail de um arquivo:

sed -n 's/.*\([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]\{2,\}\).*/\1/p' arquivo.txt

Isso imprime apenas os e-mails encontrados.

Boas práticas e observações finais

Sempre teste o comando com echo ou em uma cópia do arquivo antes de alterar o original. Use a opção -i (in-place) para editar diretamente o arquivo, mas com cuidado: sed -i.bak 's/foo/bar/g' arquivo.txt cria um backup. Lembre-se de que expressões regulares no sed usam a sintaxe BRE (Basic Regular Expressions) por padrão; para ERE (Extended), use -E. Dominar o sed aumenta significativamente sua produtividade no terminal.

Referências

Exercícios

  1. Use sed para substituir a primeira ocorrência de "erro" por "aviso" em cada linha do arquivo log.txt. Escreva o comando.

    ✓ Resposta:
    sed 's/erro/aviso/' log.txt
  2. Como substituir todas as ocorrências de "foo" por "bar" em todas as linhas, ignorando maiúsculas/minúsculas?

    ✓ Resposta:
    sed 's/foo/bar/gi' arquivo.txt
  3. Escreva um comando sed que substitua "old" por "new" apenas nas linhas 3 a 7 de um arquivo.

    ✓ Resposta:
    sed '3,7s/old/new/g' arquivo.txt
  4. Use sed para substituir "erro" por "aviso" apenas nas linhas que contêm a palavra "crítico".

    ✓ Resposta:
    sed '/crítico/s/erro/aviso/g' arquivo.txt
  5. Extraia apenas os números de telefone no formato (XX) XXXXX-XXXX de um arquivo usando sed.

    ✓ Resposta:
    sed -n 's/.*(\([0-9]\{2\}\)) \([0-9]\{5\}-[0-9]\{4\}\).*/\1 \2/p' arquivo.txt