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.:3dapaga a linha 3).N,M— o intervalo de N a M (ex.:1,5ddescarta as cinco primeiras)./padrão/— as linhas que casam com a expressão regular (ex.:/^#/dlimpa 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.pcom-n— o par que transforma osednum filtro:sed -n '/401/p'equivale a umgrep 401. Atenção:psem-nimprime as linhas casadas em duplicado, porque a impressão automática continua ativa.y/abc/xyz/— transliteração carácter a carácter (oavirax, obviray…), sempre global; é o primo dotrdentro dosed.q— termina a execução (ex.:sed 10qcomporta-se comohead).
-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 dosed: 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.-ee-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 comfind -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. -isem backup: um padrão errado com-icorrompe 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.psem-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:
3dapaga a linha 3, seja ela qual for hoje. Prefira endereços por padrão. - Forçar o
seda ser o que não é: quando a tarefa envolve colunas, aritmética ou condições, oawkresolve melhor; para transliterações simples em fluxo, otrchega.
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.
