Descubra o poder do comando sed para manipulação de texto no Linux

Descubra o poder do comando sed para manipulação de texto no Linux

No vasto universo de linha de comando, existem ferramentas extremamente versáteis e poderosas que podem ser utilizadas em diversas situações, e dentre dezenas de ferramentas, podemos facilmente destacar o sed, que proporciona uma ágil análise e transformação de textos, auxiliando a executar tarefas de forma geral.

O comando sed, uma abreviação de stream editor, oferece uma maneira eficiente e flexível de manipular e transformar textos diretamente na linha de comando, isto ajuda a economizarmos tempo e esforço durante a execução das tarefas.

Nas distribuições Linux o sed é presente por padrão. Para verificar se realmente já está instalado, pode ser executado o comando:

sed –version

 

Mas será que o sed é tudo isso mesmo?

O sed é uma ferramenta de processamento de texto que opera linha por linha em um fluxo de entrada e aplica transformações especificadas por meio de comandos. Através de uma sintaxe padrão ele realiza substituições, exclusões, inserções e outras operações de edição em massa, tudo isso sem a necessidade de abrir um editor de texto a parte.

Resumindo: O sed é tipo um “mágico” de palavras! Ele pega um monte de linhas de palavras (pode ser de um arquivo ou de outro comando) e faz mudanças nelas do jeito que você disser. É como se fosse um editor de texto mágico que troca, apaga, adiciona coisas em um monte de palavras de uma vez, sem você ter que abrir um editor de texto normal.

Sintaxe básica do sed:


sed [opções] 'comando' arquivo(s)

Alguns usos do comando sed:

  • Substituição de Texto;
  • Exclusão;
  • Filtragem;
  • Inserção de Texto;
  • Expressões Regulares.

 

Substituição de Texto

Um dos usos mais comuns do sed é a substituição de texto, o sed permite substituir palavras, frases ou padrões inteiros por outros textos. Isso é particularmente útil para renomear variáveis em código-fonte, corrigir erros ortográficos em documentos ou até mesmo atualizar URLs em arquivos HTML.

Exemplo:

Temos o arquivo frase.txt, com o seguinte conteúdo:

Estudar linux é incrível, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna incrível!

Podemos substituir todas as ocorrências da palavra incrível por extraordinário, com o comando sed é bem simples fazer isso:

sed ‘s/incrível/extraordinário/g’ frase.txt

As aspas simples () são usadas ao redor da expressão do comando sed para evitar que o shell (interpretador de comandos) expanda ou interprete os caracteres dentro delas, sendo importante quando estamos lidando com expressões regulares e caracteres especiais, que podem ser interpretados de forma equivocada pelo shell.

‘s/incrível/extraordinário/g’: É a parte da expressão regular onde ocorre a substituição.

Vamos analisar com mais detalhes:

  • s: Indica que queremos realizar uma substituição.
  • incrível: É o padrão que estamos buscando para substituir.
  • extraordinário: É o texto pelo qual estamos substituindo o padrão.
  • g: É uma flag que significa “global” e indica que a substituição deve ocorrer em todas as instâncias do padrão na linha. Se não usarmos essa flag, somente a primeira ocorrência seria substituída.
  • frase.txt: É o nome do arquivo de texto no qual desejamos realizar a substituição.

Com isso teremos o seguinte resultado:

┌─[user]@[localhost]:~

└──$ sed ‘s/incrível/extraordinário/g’ frase.txt

Estudar linux é extraordinário, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna extraordinário!

 

Caso tivéssemos um arquivos com diversas linha, a substituição poderia ser feita em linhas específicas, com algo parecido com os seguintes exemplos:

Para substituir a palavra “incrível” por “extraordinário” somente na linha 3:

┌─[user]@[localhost]:~

└──> $ sed ‘3s/incrível/extraordinário/’ resenha.txt

Estudar linux é incrível, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna incrível!

Estudar linux é incrível, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna incrível!

Estudar linux é extraordinário, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna incrível!

Estudar linux é incrível, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna incrível!

 

Podemos ver que somente a linha 3 foi alterada de acordo com o que foi indicado. Note que temos duas palavras “incrível”, somente a primeira ocorrência foi substituída, caso deseje que ambas sejam modificadas, devemos utilizar a flag ‘g’.

Para substituir a palavra “incrível” por “extraordinário” nas linhas de 2 a 5:

┌─[user]@[localhost]:~

└──> $ sed ‘2,5s/incrível/extraordinário/g’ resenha.txt

Estudar linux é incrível, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna incrível!

Estudar linux é extraordinário, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna extraordinário!

Estudar linux é extraordinário, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna extraordinário!

Estudar linux é extraordinário, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna extraordinário!

Estudar linux é extraordinário, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna extraordinário!

Estudar linux é incrível, explorar um mundo cheio de possibilidades, com os cursos da 4Linux esse percurso se torna incrível!

 

Podemos ver que somente das linhas 2 a 5 foram alteradas todas as ocorrências, conforme foi especificado no comando que agora contém a flag ‘g’.

Exclusão

Com o sed, podemos excluir linhas ou trechos de texto que não são mais relevantes. Isso é eficaz para limpar arquivos, remover linhas duplicadas e extrair informações específicas de um arquivo de log extenso.

Exemplo:

Imagine um script em shell, que será necessário remover todas as linhas que contenham a palavra “sleep“.

#!/bin/bash

echo “Olá!”

sleep 5

 

echo””

echo “Qual é o seu nome?”

read NOME

sleep 5

 

echo ” ”

echo “Boas vindas $NOME!”

sleep 5

 

exit 0

 

Ao invés de apagar linha por linha, o sed pode simplificar essa tarefa:

sed ‘/sleep/d’ script.sh

Com isso removerá todas as linhas que correspondam a um padrão, no caso que contenham a palavra “sleep” e exibirá o restante do conteúdo:

┌─[user]@[localhost]:~

└──> $ sed ‘/sleep/d’ script.sh

#!/bin/bash

echo “Olá!”

 

echo””

echo “Qual é o seu nome?”

read NOME

 

echo ” ”

echo “Boas vindas $NOME!”

 

exit 0

 

Para excluir todas as linhas em branco pode ser feito da seguinte forma:

┌─[user]@[localhost]:~

└──>$sed’/^$/d’script.sh

#!/bin/bash

echo “Olá!”

sleep 5

echo “”

echo “Qual é o seu nome?”

read NOME

sleep 5

echo ” ”

echo “Boas vindas $NOME!”

sleep 5

exit 0

 

 

Filtragem

Com o comando sed é possível isolar partes de um texto, realizando um filtro e possibilitando uma fácil manipulação dos dados dos arquivos.

Exemplo:

Para selecionar linhas com intervalos através de números de linha, dessa forma podemos exibir somente linha específicas.

Para exibir as linhas de 5 a 10 de um arquivo, temos a seguinte sintaxe:

sed -n ‘5,10p’ example.txt

 

 

Inserção de Texto

Além de substituir texto, o sed pode adicionar novas linhas ou conteúdo a um arquivo. Podemos inserir cabeçalhos, rodapés ou até mesmo linhas de código de maneira eficiente.

Exemplo:

Vamos criar um arquivo de configuração chamado config.txt para um servidor web e adicionar uma linha que defina o diretório raiz do servidor. O arquivo config.txt será assim:

Port 80

ServerName example.com

Agora, vamos adicionar uma linha que defina o diretório raiz, logo após a linha que especifica o ServerName.

Podemos fazer isso executando o seguinte:

sed ‘/ServerName/a\DocumentRoot /var/www/html’ config.txt

Isso adicionará a linha DocumentRoot /var/www/html imediatamente após a linha que contém ServerName example.com, resultando no seguinte conteúdo do arquivo config.txt:

Port 80

ServerName example.com

DocumentRoot /var/www/html

O comando sed usou o comando a (append) para inserir a linha desejada logo após a linha correspondente ao padrão especificado.

 

 

Expressões Regulares

Uma das características mais poderosas do sed é sua capacidade de trabalhar com expressões regulares. As expressões regulares permitem a manipulação e transformação de padrões complexos de maneira eficiente e automatizada.

Exemplo:

Vamos criar um arquivo, chamado datas.txt, contendo datas em um formato desorganizado. O arquivo datas.txt terá o seguinte conteúdo:

22:08:2023

8|10|2023

26-02-2023

23.4.2023

 

Para padronizar todas as datas para o formato DD/MM/AAAA. Podemos usar expressões regulares e o comando sed da seguinte maneira:

sed -E ‘s/([0-9]+)[-|.:]([0-9]+)[-|.:]([0-9]+)/\1\/\2\/\3/g’ datas.txt

Basicamente o sed está procurando um padrão de data com diferentes separadores entre os números do dia, mês e ano, capturando estes números em grupos e substituindo o padrão pela data no formato DD/MM/AAAA.

  • -E: Ativa o uso de expressões regulares estendidas, que permite uma sintaxe mais poderosa para as expressões regulares.
  • s/: Início do comando de substituição.
  • ([0-9]+): Captura um ou mais dígitos e coloca-os no primeiro grupo de captura (\1).
  • [-|.:]: Corresponde a qualquer um dos caracteres hífen –, barra vertical |, dois pontos :, ou ponto . . Isso é usado para capturar os possíveis separadores entre as partes da data.
  • ([0-9]+): Captura um ou mais dígitos e coloca-os no segundo grupo de captura (\2).
  • [-|.:]: Outro separador, como explicado anteriormente.
  • ([0-9]+): Captura um ou mais dígitos e coloca-os no terceiro grupo de captura (\3).
  • /: O caractere de barra (“/”) é usado para a substituição, separando as partes da data.
  • \1\/\2\/\3: Aqui, os grupos capturados são reorganizados na ordem correta, separados por barras (/), para formatar a data como DD/MM/AAAA.
  • /g: A opção g no final do comando de substituição indica que todas as ocorrências do padrão na linha devem ser substituídas, não apenas a primeira.

 

Algumas das opções mais comuns do comando sed:

-e script ou –expression=script

Esta opção permite que seja especificado um ou mais scripts de edição separados por ponto-e-vírgula (;). Cada script consiste em comandos de edição do sed que serão aplicados em sequência.

Conteúdo do arquivo listagem.txt:

Nome do Software: MeuSoftware

Mascote: MascoteSoftware

 

Neste exemplo, dois comandos de substituição são aplicados em sequência. Inicialmente todas as ocorrências de “Software” são substituídas por “Linux“, e depois todas as ocorrências de “Mascote” são substituídas por “Tux“.

┌─[user]@[localhost]:~

└──> $ sed -e ‘s/Software/Linux/g; s/Mascote/Tux/g’ listagem.txt

Nome do Linux: MeuLinux

Tux: TuxLinux

 

-f script-file ou –file=script-file

Esta opção lê os comandos de edição de um arquivo externo, em vez de fornecê-los diretamente na linha de comando, ou seja, podemos fornecer um arquivo contendo diversos comandos que serão aplicados na edição, ao invés de especificar individualmente na linha de comando. Isso é válido quando temos muitos comandos ou quando desejamos reutilizar os scripts.

Vamos criar o arquivo scriptsed.sed contendo o mesmo comando de edição sed que vimos no último exemplo:

O conteúdo do arquivo terá esta linha de comando:

s/Software/Linux/g; s/Mascote/Tux/g

Agora basta executar o comando, e teremos a mesma saída da opção -e, mas com as substituições indicadas feitas por meio de um arquivo de script:

┌─[user]@[localhost]:~

└──> $ sed -f scriptsed.sed listagem.txt

Nome do Linux: MeuLinux

Tux: TuxLinux

 

-i[SUFFIX] ou –in-place[=SUFFIX]

Esta opção edita o arquivo de entrada diretamente e salva as alterações no arquivo. A opção SUFFIX é opcional e permite que seja especificada uma extensão para o arquivo de backup que será criado, sendo assim o arquivo original será salvo com esse sufixo.

Exemplo:

sed-i.bkp’s/Software/Linux/g’listagem.txt

 

Neste exemplo, todas as ocorrências de “Software” são substituídas por “Linux” no arquivo listagem.txt e o arquivo original será salvo como listagem.txt.bkp, e o arquivo listagem.txt será modificado com as novas alterações.

 

-n ou –quiet ou –silent

Esta opção ignora a saída padrão do sed, fazendo com que apenas as linhas modificadas ou especificadas sejam mostradas.

Vamos usar como exemplo o arquivo que vimos anteriormente, config.txt:

Port 80

ServerName example.com

DocumentRoot /var/www/html

 

E teremos o seguinte resultado ao executar o comando:

┌─[user]@[localhost]:~

└──> $ sed -n ‘/ServerName/p’ config.txt

ServerName example.com

 

 -r ou -E ou –regexp-extended

Esta opção permite usar expressões regulares estendidas (suporta metacaracteres como +, ?, (), etc.) ao invés de expressões regulares básicas para os padrões de buscas e substituições.

Vamos utilizar como exemplo o seguinte arquivo, contatos.txt:

Nome: Linus Telefone: (123) 456-7890

Nome: Richard Telefone: (234) 567-8901

Nome: Andrew Telefone: (345) 678-9012

 

Agora, usando a opção -r, podemos escrever um comando sed para capturar e imprimir os números de telefone no formato especificado:

sed -r -n ‘s/.*Telefone: \(([0-9]{3})\) ([0-9]{3})-([0-9]{4}).*/\1-\2-\3/p’ contatos.txt

 

Neste exemplo, a expressão regular .*Telefone: \(([0-9]{3})\) ([0-9]{3})-([0-9]{4}).* corresponde a linhas que contenham “Telefone:” no formato (xxx) xxx-xxxx, onde ([0-9]{3}) captura os três dígitos do código de área, ([0-9]{3}) captura os três dígitos do prefixo e ([0-9]{4}) captura os quatro dígitos restantes. O uso dos parênteses () cria grupos de captura que podem ser referenciados posteriormente na substituição.

A saída será a seguinte:

┌─[user]@[localhost]:~

└──> $ sed -r -n ‘s/.*Telefone: \(([0-9]{3})\) ([0-9]{3})-([0-9]{4}).*/\1-\2-\3/p’ contatos.txt

123-456-7890

234-567-8901

345-678-9012

 

Essas são algumas das principais opções do comando, mas o sed possui muitas outras opções e recursos que podem ser explorados para realizar uma ampla variedade de manipulações de texto. Para consultar o manual do sed você pode executar man sed, para obter informações detalhadas sobre todas as opções disponíveis.

 

Conclusão

O comando sed é uma ferramenta de linha de comando poderosa e versátil para a manipulação automatizada de texto. Com recursos avançados de substituição, exclusão e inserção baseados em expressões regulares, o sed oferece a capacidade de realizar transformações complexas em massa, otimizando o fluxo de trabalho de edição de texto. Ao explorar e praticar o uso do sed, poderá evoluir suas habilidades na linha de comando, economizando tempo ao automatizar tarefas de edição repetitivas e concluir uma variedade de desafios de processamento de texto com precisão. Em resumo, o sed é uma ferramenta indispensável para profissionais que desejam potencializar as tarefas de sua jornada no universo da linha de comando.

 

 

 

Anterior Curso 4Linux: Domine a orquestração de microsserviços em nuvem!
Próxima Descubra como o MetalLB aprimora o balanceamento de carga em ambientes Kubernetes on-premises

About author

Deborah Melo
Deborah Melo 10 posts

Analista de Infraestrutura | Construtora na 4Linux | LPIC 1 | Graduada em Eng. Elétrica | Apaixonada por tecnologia e ideologias Open Source.

View all posts by this author →

Você pode gostar também

Infraestrutura TI

Engenheiro de Dados: a profissão essencial na era da informação

Profissões tendem a desaparecer e surgir com outras roupagens em um mundo onde a quantidade de conhecimento cresce exponencialmente. Embora esse fenômeno cause crises em algumas áreas, ele pode ser

Infraestrutura TI

Guia Completo: Como Utilizar o Vagrant para Gerenciar Máquinas Virtuais

Introdução Vagrant é uma ferramenta para criação e gerenciamento de máquinas virtuais de forma automatizada. Ele é usado principalmente para fins de desenvolvimento, permitindo que seja criado um ambiente de

Infraestrutura TI

Introdução a Distribuições Linux

Introdução Esse post tem a missão de introduzir o contexto de distribuições do Linux, suas diferenças e trazer uma ótica analítica para distros (distribuições) fora da curva. Para começar, temos