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.
About author
Você pode gostar também
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
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
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