Comando sed linux: transforme, substitua e filtre textos

Compartilhe:

Tela de notebook exibindo comando sed sendo executado no terminal linux com

Está precisando substituir textos, remover linhas, filtrar informações e fazer alterações em arquivos diretamente pelo terminal sem necessidade de uma edição interativa ?

O comando sed pode fazer todas essas tarefas, sem sequer abrir um editor de texto interativo, poupando tempo.

Neste artigo, você vai entender como o comando sed funciona, aprender a usa-lo com exemplos práticos que podem ser utilizados na administração de sistemas linux.


Pré-requisitos

Para seguir os conhecimentos técnicos apresentados no artigo, você precisará:

  • Computador com distribuição linux instalada, como: ubuntu, debian, redhat ou derivados.
  • Acessar o terminal com usuário root ou comando sudo para instalar o sed, caso não esteja instalado.

Para que serve o comando sed ?

O comando sed é uma ferramenta projetada para filtrar e transformar fluxo de dados textuais através da linha de comando, ele não requer a abertura do arquivo em uma interface, como é feito por editores de texto (como Vi/Vim ou Nano).

O sed linux lê dados da entrada (seja de um arquivo ou via pipe) linha por linha, aplica as instruções fornecidas e envia o resultado para a saída padrão. Ele também possibilita fazer múltiplas alterações em arquivos instantaneamente usando a interface de linha de comando.

O comando sed já vêm instalado por padrão na maioria das distribuições linux, mas caso não esteja presente no Debian ou Ubuntu, utilize o gerenciador de pacotes apt para instala-lo:

Em distros Red Hat, AlmaLinux e Rocky Linux, instale o pacote sed executando o comando:

Aprendendo a usar o comando sed

Para utilizar o comando sed é necessário primeiro entender sua sintaxe, que é:

Explicação:

sed – É o programa que altera o arquivo ou o fluxo de texto recebido a partir da entrada padrão.

opções – São as opções (opcionais) que alteram o que o comando sed faz por padrão.

comando – Indica o que o sed deve fazer com as linhas que está processando.

arquivo – É o arquivo sobre o qual o comando será executado. Se nenhum arquivo for informado, o sed lê dados da entrada padrão (stdin) através de PIPES.

Ao executar o sed o seu comando (instrução) geralmente fica entre aspas para impedir que o shell interprete como caracteres especiais, veja o exemplo a seguir:

Para facilitar, a tabela abaixo contém opções mais usadas pelo sed para uma consulta rápida:

OpçãoDescriçãoExemplos de uso
-iEdita o arquivo em vez de exibir na tela.sed -i ‘s/DB/DB_NAME/’ app.cfg
-i.bkpIgual à opção “-i”, mas cria um backup do arquivo antes de realizar alteração.sed -i.bak ‘s/DB/DB_NAME/’ app.cfg
-nSomente exibe na tela quando você manda explicitamente, normalmente usando a instrução “p”.sed -n ‘/error/p’ system.log
-ePermite executar múltiplos comandos sed em uma única linha.sed -e ‘/error/p’ -e ‘s/avc/AVC/’ system.log
-fLê comandos de um arquivo de script.sed -f script.sed dados.txt
-EUtiliza expressões regulares estendidas.sed -E ‘s/[0-9]+/800/’ file.conf

Para aprender mais sobre o comando sed a seguir tem vários exemplos práticos de uso explicado em detalhes.

Substituir a primeira ocorrência de um texto por linha

Para substituir uma informação utilize o comando “s” do sed, por exemplo, você pode precisar alterar a primeira a palavra “HTTP” encontrada por linha por “HTTPS” de um arquivo sem modificar o resto.

O comando acessa o arquivo “app.conf” e altera a primeira palavra “HTTP” encontrada em cada linha para “HTTPS”, em seguida o sed linux envia o resultado para a tela.

Saiba que o sed não altera o arquivo, a menos que use a opção “-i“, podendo testar o padrão antes de aplicar a alteração definitiva.

Substituir todas as ocorrências de um texto na mesma linha

No exemplo anterior foi substituída somente a primeira ocorrência encontrada por linha, mas muitas vezes, uma linha contém múltiplos parâmetros antigos com valores iguais e que devem ser atualizados simultaneamente.

O exemplo seguir, o comando sed altera todos os endereços “127.0.0.1” por “122.200.201.1” em qualquer linha.

A adição do comando “g” no final indica alteração global. Isso garante que, no exemplo, se o IP antigo aparecer três vezes na mesma linha, todos os três serão trocados pelo IP novo.

Salvar as alterações no arquivo

O comando sed pode utilizar a opção “-i” para salvar as alterações sem exibir na tela sua saída. Essa opção é necessária quando você precisa aplicar uma mudança permanente em um arquivo sem redirecionar a saída.

O exemplo acima mostra como substituir todas as ocorrências “Level Debug=True” por “Level Debug=False” no arquivo de configuração “app.conf”.

É útil para alterar configurações em um ou mais arquivos sem precisar abri-los com editor de texto como vim ou nano.

Altera o arquivo e cria um backup antes

Alterar arquivos críticos em servidores de produção é sempre um risco sem um backup prévio. Você pode utilizar a opção “-i” do comando sed seguido de uma extensão (exemplo: “.bak”) para criar uma cópia antes de efetivar a alteração, veja o exemplo de uso:

O comando sed gera automaticamente o backup “app.conf.bak” com o conteúdo original e realiza a substituição no arquivo “app.conf”.

Deletando linhas

O programa sed pode também remover linhas de um arquivo, utilizando o comando “d” após o número da linha. Por exemplo, para remover a configuração da linha número 5 de um arquivo.

A instrução “5d” apaga a quinta linha do arquivo “server.conf“.

Também é possível apagar um intervalo específico do arquivo, veja um exemplo de uso:

O comando sed acima, remove todo o bloco de código da linha 10 até a linha 20. Pode ser usado para apagar trechos grandes de código.

Remover linhas em branco e comentadas

Já precisou apagar linhas em branco de um script ou arquivo de configuração sem precisar usar um editor de texto ? Pois é, o comando sed também pode fazer isso para você.

Alguns arquivos de configuração contém muitas linhas vazias, para apagar, para removê-las execute o sed:

Na expressão regular “^$“, o caractere “^” (circunflexo) identifica o início e “$” (cifrão) o fim da linha, sendo assim, uma linha sem caracteres entre eles. A instrução “d” remove essas linhas vazias do arquivo (server.conf).

Também é possível apagar comentários de arquivos de configuração de serviços como Nginx, Samba ou Squid, arquivos costumam vir repletos de comentários.

O código ‘/^#/d‘ deleta todas as linhas que começam com o caractere “#” cerquilha, deixando a visualização mais limpa.

Exibindo apenas linhas que correspondem a um padrão

O comando sed pode fazer o mesmo trabalho do utilitário grep, mas utilizando uma lógica um pouco diferente. No exemplo, a seguir é buscado pela palavra “ERROR” no arquivo “app.log”.

A opção “-n” desativa a exibição padrão e o comando “p” (print) imprime apenas as linhas que contêm o termo “ERROR“, não exibindo o restante do log. Podendo ser utilizado para encontrar erros nos registros da aplicação sem mostrar todo o conteúdo.

Substituir texto ignorando maiúsculas e minúsculas

O comando sed difere letras MAIÚSCULAS e minúsculas ao buscar um padrão para ser substituído. Veja a seguir um exemplo que faz o sed ignorar o case-sensitive, procurando padrões com grafias mistas: “false“, “False“, “FALSE“:

No exemplo, o comando “i” logo após o “g” no final instrui o programa sed a ignorar a diferença entre maiúsculas e minúsculas ao realizar a troca, assim a palavra pesquisada (no exemplo é false) pode corresponder com “false”, “False” ou “FALSE” e vai ser substituída por “True”.

Inserir uma linha antes de uma ocorrência específica

Em arquivos de configurações ou scripts é uma prática comum adicionar comentários antes do código, explicando o que ele faz. O comando sed pode ser usado para esse fim.

Por exemplo imagine que você precisa adicionar uma nova linha com o seguinte conteúdo “# Configuração do endereço” antes do código “ip_address=10.10.20.5” no arquivo “addresses.cfg”, execute:

Nesse contexto a instrução “i” (insert) insere o texto que vêm após o caractere “\” antes da linha que contém o código pesquisado (“ip_address=10.10.20.5”).

Adicionar uma linha depois de uma ocorrência específica

Já precisou adicionar um novo conteúdo após um termo específico em um arquivo ? O sed pode injetar diretivas logo abaixo de um parâmetro já existente.

No comando abaixo é procurado no arquivo “server.conf” o código “listen 80 default_server”, caso seja encontrado é adicionado o código após o caractere “\” que é “listen 443 default_server;”.

Após o caractere “/” (fechamento da pesquisa) o comando “a” (append) insere o novo conteúdo em uma nova linha abaixo ao padrão localizado.

Utilizando caracteres delimitadores diferentes

Existe um obstáculo que alguns iniciantes enfrentam ao utilizar o comando sed ao precisar alterar caminhos de diretórios no linux (ex: /var/www/html), o uso da barra “/” como delimitador do sed gera erros devido ao conflito de sintaxe.

O sed permite substituir o delimitador padrão “/” por qualquer outro caractere, como o “|” ou “@“. Isso evita a necessidade de utilizar barras de escape “\” em todos os diretórios.

Por exemplo, suponha que precisa alterar a localização dos arquivos do site de “/var/www/html” para “/srv/app/html” na configuração do arquivo “server.conf” de uma aplicação web, você executaria:

O comando sed acima está usando o delimitador “|” e criando um backup “server.conf.bkp” antes de qualquer alteração do arquivo original “server.conf” e em seguida muda a localização dos arquivos do site para “/srv/app/html”.

Executar múltiplas edições em um único comando

Nesse momento, você já pode esta utilizando o comando sed para fazer alterações em arquivos, mas executar o comando para cada edição, pode ser trabalhoso, não acha ? Ao usar a opção “-e” o comando sed possibilita executar múltiplas alterações em somente um comando.

Para cada nova operação basta usar a opção “-e”, assim você consegue, por exemplo, atualizar diferentes seções de um arquivo sem precisar executar o sed várias vezes seguidas, veja o exemplo a seguir:

O comando sed do exemplo, primeiro altera a configuração “Listen 80” para “Listen 8080” e em seguida muda “address 127.0.0.1” para “address 122.200.201.1” no arquivo “app.conf”.

Usar expressões regulares com o comando sed

O comando sed quando combina seus comandos com expressões regulares, pode aumentar seu potencial e fazer tarefas mais complexas.

Suponha que você precisa encontrar no arquivo de log “app.log” registros com a palavra “ERROR” ou “WARNING” ou “CRITICAL”, você pode executar:

A opção “-E” é utilizada para ativar o uso de expressões regulares pelo comando sed e opção “-n” para exibir somente linhas que contém um dos padrões informados.

O caractere PIPE tem o papel de “OU”, ou seja, encontre no arquivo “app.log” a palavra “ERROR” ou “WARNING” ou “CRITICAL” e quando encontrar mostre na tela.

Outro exemplo, você trabalha com uma aplicação que quando registra erros nos logs associa cada erro a um número. O arquivo “app1.log” possui:

Você quer localizar somente os códigos de erros de 4 dígitos, para essa necessidade execute:


Explicação da expressão: ^[0-9]{4}

^ (circunflexo) → início da linha.

Error: → Procura literalmente no inicio da linha por “Error:” seguido de um espaço.

[0-9] → Representa um número de 0 à 9.

{4} → Exige exatamente 4 ocorrências de “[0-9]” e no final mais um espaço, porque existe um espaço entre o código numérico e a mensagem em seguida.

Gostou de aprender sobre o sed ? Para aprofundar seu conhecimento em estruturas avançadas do utilitário, é recomendável consultar o manual do comando sed online, que contém todos os detalhes.

Conclusão

O comando sed é indispensável para transformar, filtrar e substituir textos de forma ágil no Linux. Com as opções e expressões corretas, você automatiza tarefas e ganha produtividade no terminal.

Pratique os exemplos aqui apresentados em ambientes de testes e aos poucos utilize o sed na prática no trabalho.

Ficou com alguma dúvida, tem sugestões ou elogios sobre o artigo ? Deixe seu comentário abaixo!

Perguntas Frequentes (FAQ) sobre o comando sed

O comando sed altera o arquivo original ?

Não por padrão. O resultado é enviado para a saída padrão. Para alterar o arquivo, utilize a opção “-i”.

Qual a diferença entre os comandos sed e grep ?

O comando grep é utilizado para localizar e filtrar linhas que correspondem a determinado padrão. O sed, além de filtrar, consegue transformar o conteúdo, substituir textos, remover linhas e realizar outras operações de edição.

É possível reverter alterações feitas com “sed -i” ?

Não. A alteração realizada com a opção “-i” sobrescreve o arquivo. Mas você pode utilizar a opção de backup (ex: sed -i.bak), assim é criada uma cópia antes de alterar o arquivo original.

Por que meu comando sed falha ao tentar substituir caminhos de pastas ?

Isso ocorre porque o caractere “/” (barra) do caminho entra em conflito com o delimitador da instrução de substituição “s/busca/troca/“. Para corrigir, utilize outro caractere delimitador, como “|” (PIPE), exemplo: “s|/caminho/antigo|/caminho/novo|g“.

Como posso fazer o sed ignorar maiúsculas e minúsculas ?

Para ignorar a diferença de caixa na busca durante uma substituição, adicione o comando “i” ao final do bloco de comando, como no exemplo: “s/padrão/novo/gi”.

Navegue por tópicos:

Foto de Edson Oliveira
Edson Oliveira

Especialista em Linux, trabalhando com TI tem experiência no gerenciamento, solução de problemas e suporte de servidores linux em ambientes corporativos.

Professor de cursos voltados a linux, tecnologias open source e certificações LPI. Possui as certificações LPIC-1, LPIC-2 e LPIC-3 (Mixed Environment).

Navegue por tópicos:

Você também pode gostar:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Valorizamos sua privacidade

Utilizamos cookies para aprimorar sua experiência de navegação, exibir anúncios ou conteúdo personalizado e analisar nosso tráfego. Ao clicar no botão “Aceitar todos”, você concorda com nosso uso de cookies.

Para mais informações leia nossa Política de Privacidade.