sed: introdução
Esta aula introduz o comando sed no Linux, focando no comando de substituição s///, suas flags (g, i), endereçamento de linhas e casos de uso práticos. O aluno aprenderá a editar fluxos de texto de forma eficiente, com exemplos detalhados e exercícios.
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.txtCasos 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.txtIsso 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
- GNU sed manual
- man page do sed
- Expressões regulares no Unix
- Grymoire: sed tutorial
- The Geek Stuff: sed endereçamento
Exercícios
Use
sedpara substituir a primeira ocorrência de "erro" por "aviso" em cada linha do arquivolog.txt. Escreva o comando.✓ Resposta:sed 's/erro/aviso/' log.txtComo 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.txtEscreva um comando
sedque substitua "old" por "new" apenas nas linhas 3 a 7 de um arquivo.✓ Resposta:sed '3,7s/old/new/g' arquivo.txtUse
sedpara substituir "erro" por "aviso" apenas nas linhas que contêm a palavra "crítico".✓ Resposta:sed '/crítico/s/erro/aviso/g' arquivo.txtExtraia 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