Comando sed: editar texto em fluxo no Linux

Terminal Linux a mostrar o comando sed a substituir texto num ficheiro de configuração

Há um momento na vida de qualquer administrador de sistemas em que abrir um editor deixa de fazer sentido: quando é preciso alterar a mesma linha em cinquenta ficheiros, limpar milhares de comentários de uma configuração ou anonimizar os endereços IP de um log antes de o partilhar. É exatamente para isso que existe o sed — o stream editor — que edita texto em fluxo, linha a linha, sem abrir janela nenhuma e sem intervenção manual.

Neste artigo da série sobre comandos Linux explicamos a mecânica do sed, as expressões e opções que realmente se usam no dia a dia, e o papel que ele desempenha em cibersegurança — da sanitização de evidências ao hardening em massa. No final, pode praticar tudo num simulador interativo, sem risco para nenhum ficheiro real.

O que faz o sed

O sed lê a entrada linha a linha, coloca cada linha num espaço de trabalho interno (o pattern space), aplica-lhe o script de edição que recebeu e imprime o resultado no standard output. Dois princípios definem o seu comportamento: por omissão imprime todas as linhas, editadas ou não, e por omissão nunca altera o ficheiro original — o resultado sai apenas no terminal, a menos que se peça explicitamente o contrário com -i.

sed [OPÇÕES] 'script' [FICHEIRO...]

sed 's/antigo/novo/' config.txt        # substitui a 1.ª ocorrência em cada linha
sed -n '/erro/p' registo.log           # imprime só as linhas que casam
sed -i.bak 's/^Port 22$/Port 2222/' sshd.conf   # edita no lugar, com cópia .bak

O script combina, opcionalmente, um endereço (que linhas tocar) com um comando (o que lhes fazer). É esta composição — endereço mais comando — que dá ao sed uma expressividade enorme com muito pouca sintaxe.

As opções que interessam

A substituição s///

O comando mais usado do sed é o s/padrão/substituto/. Sem mais nada, substitui apenas a primeira ocorrência do padrão em cada linha — um pormenor que apanha muita gente desprevenida. As flags no fim mudam esse comportamento:

  • g — substituição global: todas as ocorrências da linha, não só a primeira.
  • 2, 3 — substitui apenas a N.ª ocorrência da linha.
  • p — imprime a linha quando houve substituição; combinado com -n, mostra apenas as linhas alteradas.
  • I — ignora maiúsculas/minúsculas no padrão (extensão GNU).

O delimitador não tem de ser a barra: quando o padrão contém caminhos, s|/var/www|/srv/web| evita uma floresta de \/. E no substituto há dois atalhos preciosos: & representa o texto que casou com o padrão, e \1 a \9 reutilizam o que foi capturado entre \( e \).

sed 's/\([0-9]\+\.[0-9]\+\.[0-9]\+\)\.[0-9]\+/\1.xxx/' acesso.log
# 192.0.2.99 → 192.0.2.xxx — anonimiza o último octeto, mantém o prefixo

Endereços: escolher as linhas

  • N — a linha N (ex.: 3d apaga a linha 3).
  • N,M — o intervalo de N a M (ex.: 1,5d descarta as cinco primeiras).
  • /padrão/ — as linhas que casam com a expressão regular (ex.: /^#/d limpa comentários).
  • $ — a última linha; /ini/,/fim/ — do primeiro padrão ao segundo; addr! — negação, aplica o comando às linhas que não casam.

Um conselho de quem já se queimou: endereços numéricos absolutos são frágeis. Se o ficheiro ganhar uma linha nova no topo, 3d passa a apagar outra coisa. Sempre que possível, ancore-se a padrões.

Apagar, selecionar e transliterar

  • d — apaga as linhas selecionadas; o resto passa intacto.
  • p com -n — o par que transforma o sed num filtro: sed -n '/401/p' equivale a um grep 401. Atenção: p sem -n imprime as linhas casadas em duplicado, porque a impressão automática continua ativa.
  • y/abc/xyz/ — transliteração carácter a carácter (o a vira x, o b vira y…), sempre global; é o primo do tr dentro do sed.
  • q — termina a execução (ex.: sed 10q comporta-se como head).

-E, -i e as restantes opções de linha de comandos

  • -E — usa expressões regulares estendidas: grupos escrevem-se ( ) e o + dispensa a barra invertida. A mesma lógica, muito mais legível.
  • -i — edita o ficheiro no próprio lugar, sem produzir output. É a opção mais perigosa do sed: um padrão mal escrito e o original desapareceu. Use sempre a forma -i.bak, que guarda primeiro uma cópia com o sufixo indicado.
  • -e e -f — encadeiam vários scripts na mesma invocação ou leem o script de um ficheiro; o separador ; faz o mesmo dentro de um único argumento.
  • -z — trata a entrada separada por bytes NUL em vez de novas linhas, útil em conjunto com find -print0.

sed em cibersegurança

Sanitizar logs antes de partilhar. Enviar um log a um fornecedor, anexá-lo a um ticket ou usá-lo em formação implica remover dados pessoais e identificadores internos. Com grupos de captura, o sed anonimiza endereços IP mantendo a estrutura analisável — 192.0.2.99 passa a 192.0.2.xxx — sem destruir horas, códigos de resposta nem a correlação entre eventos.

Remover segredos de configurações. Antes de partilhar um .env ou um excerto de configuração, um comando como sed '/PASS\|TOKEN/s/=.*/=REDACTED/' garante que palavras-passe e chaves de API nunca saem do perímetro. Combinar o endereço com a substituição limita a edição exatamente às linhas sensíveis.

Hardening em massa. Endurecer dezenas de máquinas passa por alterações repetitivas e auditáveis: sed -i.bak 's/^PermitRootLogin yes/PermitRootLogin no/' sshd_config aplicado via automação corrige uma diretiva em toda a frota, e as cópias .bak documentam o estado anterior.

Cuidado em forense. Em resposta a incidentes, o sed é excelente para extrair janelas temporais de logs (sed -n '/09:12/,/09:17/p') — mas nunca com -i sobre evidência original. Trabalhe sempre sobre cópias e preserve os hashes dos ficheiros recolhidos: editar evidência no lugar destrói a cadeia de custódia.

Experimente no simulador interativo

O simulador abaixo põe lado a lado um ficheiro (uma configuração SSH, um log de acessos ou um .env com segredos fictícios) e o terminal que executa o sed. As linhas que vão mudar aparecem realçadas à esquerda, como um diff, e o resultado surge à direita. Use Demonstrar tudo para seguir a sequência guiada — do hardening à triagem de um ataque e à sanitização de segredos — ou combine livremente as opções (s///, g, endereços, -n, -E, -i.bak) e observe como o output muda.

Erros comuns e boas práticas

  • Esquecer o g: sem a flag, só a primeira ocorrência de cada linha é substituída — e o erro pode passar despercebido durante muito tempo.
  • -i sem backup: um padrão errado com -i corrompe o ficheiro sem hipótese de recuo. Teste primeiro sem -i, grave depois com -i.bak — e só remova as cópias quando confirmar o resultado.
  • p sem -n (e vice-versa): o primeiro duplica linhas, o segundo silencia tudo. São um par: memorize-os juntos.
  • Confundir BRE com ERE: sem -E, grupos e + exigem barra invertida (\(, \+); com -E, dispensam-na. Misturar as duas sintaxes gera padrões que “não casam” sem razão aparente.
  • Endereços absolutos em ficheiros vivos: 3d apaga a linha 3, seja ela qual for hoje. Prefira endereços por padrão.
  • Forçar o sed a ser o que não é: quando a tarefa envolve colunas, aritmética ou condições, o awk resolve melhor; para transliterações simples em fluxo, o tr chega.

Conclusão

O sed é a ferramenta que transforma edições repetitivas em comandos de uma linha: substituir com precisão cirúrgica, apagar por endereço, filtrar como um grep e — com a devida rede de segurança — gravar no próprio ficheiro. Em cibersegurança, é o canivete da sanitização de logs, da remoção de segredos e do hardening automatizado. Se quer levar estas competências mais longe, a HJFR oferece formação prática em Linux e cibersegurança e consultoria especializada: explore o nosso catálogo de serviços e reveja também outros artigos da série, como o dedicado ao comando useradd.

Este artigo faz parte da série «Comandos Linux, um a um» do blog HJFR — fique atento aos próximos comandos.