Voltar ao blog

Uma Visão Geral do Editor de Fluxo Sed para Manipular Texto no Linux

Uma Visão Geral do Editor de Fluxo Sed para Manipular Texto no Linux

O comando sed é uma abreviação para stream editor. É uma ferramenta amplamente popular em sistemas Linux/UNIX. Sed não é um editor de texto por si só. No entanto, ele pode realizar várias modificações para manipular um determinado texto. A entrada de texto é enviada como um fluxo (stream). Sed então realiza as ações instruídas no fluxo. Este guia fornece uma visão geral do sed comando e como operá-lo para manipular texto com sucesso no Linux.

Sed no Linux

O fluxo de entrada do sed pode vir de um arquivo de texto ou de STDIN (entrada padrão). Podemos trabalhar com a saída de outro comando ou trabalhar diretamente com um arquivo de texto. A sed ferramenta vem pré-instalada em todas as Linux distribuições.

Visão Geral do Uso do Sed

O sed comando segue a seguinte estrutura:

Para fins de demonstração, obtivemos a versão em texto da licença GPL versão 3:

Manipulate Text with Sed 7

O seguinte sed comando imprimirá o conteúdo do arquivo de texto:

Aqui, o sed está realizando as operações descritas entre aspas simples e imprimindo a saída. Como não há nenhuma opção definida, o sed simplesmente realizará uma operação em branco e imprimirá todo o conteúdo do arquivo.

Sed também aceita a saída de um comando diferente como fluxo de entrada. No próximo exemplo, envie o conteúdo do arquivo de texto GPL v3 via pipe para o sed para realizar uma operação em branco:

Como Imprimir Linhas

Sem nenhuma opção fornecida, o sed imprimirá todo o conteúdo do arquivo diretamente. Em vez disso, podemos enviar explicitamente o comando de impressão para imprimir os resultados diretamente na saída padrão (STDOUT).

Para imprimir a saída, use o caractere p:

Manipulate Text with Sed 6

Por padrão, o sed imprime a saída na tela. Como usamos especificamente o comando de impressão, o sed imprimirá cada linha duas vezes. Sed opera linha por linha. Ele lê uma linha, realiza operações específicas, a imprime e passa para a próxima linha.

Como podemos ver, cada linha é impressa duas vezes. Se o resultado for confuso assim, podemos limpá-lo usando a opção -n. Ela suprime a função de impressão automática. Como estamos enviando o comando de impressão, não precisamos da função padrão de impressão de saída ativada:

Classes de Caracteres Regex

Em expressões regulares, existem várias classes de caracteres. Cada uma dessas classes possui um intervalo. Muitas classes também possuem múltiplas expressões. A maioria das classes são intervalos de caracteres:

    • [a-z]: Caractere minúsculo
    • [A-Z]: Caractere maiúsculo
    • [0-9]: Dígitos
    • [a-zA-z]: Alfabeto
    • [a-zA-z0-9]: Qualquer caractere alfanumérico

Essas classes de caracteres também possuem notações diferentes:

    • [:lower:]: Caractere minúsculo
    • [:upper:]: Caractere maiúsculo
    • [:digit:]: Dígitos
    • [:alpha:]: Alfabeto
    • [:alphanum:]: Caractere alfanumérico

Por exemplo, o seguinte comando imprimirá todas as linhas que contêm pelo menos um dígito:

Manipulate Text with Sed 3

Intervalos de Endereço

Podemos especificar a parte específica do fluxo de texto com a qual trabalhar. Pode ser a localização estática de uma linha ou um intervalo de linhas. No primeiro exemplo, imprimiremos a linha 5 do arquivo de texto GPL v3:

$ sed -n

Em vez de uma única linha, também podemos especificar um intervalo de linhas para trabalhar. Aqui, definimos o intervalo de endereços da linha 5 à linha 9 (total de 5 linhas) no qual o sed irá trabalhar:

gpl-3.0.txt

Também existem maneiras diferentes de especificar o endereço da linha. Em vez de determinarmos os números das linhas nós mesmos, podemos reorganizar o exemplo anterior para que o sed comece a partir da linha 5 e opere nas próximas 5 linhas:

5,+5p

Outra maneira de especificar linhas é usando intervalos. No próximo exemplo, o sed começará a partir da linha 1 e operará em linhas alternadas:

Exclusão de Texto

Até agora, trabalhamos na impressão de linhas de texto de destino. Em vez de imprimir, podemos remover as linhas da saída. No exemplo a seguir, removeremos várias linhas do início. Aqui, não precisamos usar a opção -n porque queremos que o sed imprima tudo o que não for excluído. Para a exclusão de linhas, usaremos a opção d:

Manipulate Text with Sed 2

Note que o arquivo de origem ainda está intacto. O Sed está apenas realizando a exclusão de linhas durante a saída. Se desejar, você pode salvar a saída do sed em um arquivo. Você pode sobrescrever o arquivo original ou salvá-lo como um arquivo diferente:

Em vez de gravar manualmente a saída em um arquivo, o sed pode realizar uma edição local no arquivo original. Em resumo, o sed editará o arquivo original e gravará todas as alterações feitas. Este método sobrescreverá o arquivo original, por isso deve ser usado com cuidado:

Como a edição local é perigosa, o sed vem com o recurso de backup. Ao realizar edições locais, use -i.bak em vez de -i para fazer um backup antes de editar. O Sed criará o arquivo de backup com a extensão .bak:

Substituição de Texto

Esta é, de longe, uma das implementações mais comuns do sed. Ele pesquisa por um padrão de texto e substitui o padrão por um texto fornecido. Aqui, o padrão de texto é descrito em expressões regulares (regex, para abreviar). Para saber mais sobre o uso de regex, siga este tutorial que descreve como usar o Grep com regex para pesquisar padrões de texto em arquivos.

Aqui está um exemplo da substituição de texto mais básica usando regex:

Aqui, s é o comando para substituição. As barras são delimitadores para o padrão e a substituição. Vamos colocá-lo em ação:

Manipulate Text with Sed 5

O próximo exemplo demonstrará o uso do sublinhado (_). Aqui, os sublinhados atuarão como delimitadores:

Aqui, estamos pesquisando por com/index para alterar por net/home. Observe o posicionamento dos sublinhados, pois eles são cruciais. Por exemplo, se faltar o último sublinhado, o sed retornará um erro:

Precisamos de um arquivo fictício para praticar algumas substituições. Aqui, tenho uma versão cortada do arquivo de texto GPL v3:

Vamos realizar algumas substituições básicas de texto:

Dê uma olhada no próximo exemplo. Queremos alterar todas as instâncias de the para THE :

$ echo

Notou algo? O Sed não alterou todas as instâncias de the. Na verdade, foi apenas a primeira instância. O que está acontecendo? Este é o comportamento padrão da opção s. Ela corresponde apenas à primeira instância de uma determinada linha e passa para a próxima. Para garantir que o sed verifique a linha inteira em busca do padrão de pesquisa, precisamos usar uma flag opcional g. Vamos corrigir o comando:

Agora está funcionando como esperado. Outra maneira interessante de usar o comando é especificar o número de instâncias a serem alteradas. No exemplo anterior, havia 3 instâncias de the, certo? Que tal especificarmos para alterar apenas a 3ª instância? A alteração ocorrerá na flag opcional:

Se você estiver trabalhando com um arquivo de texto grande, pode ajudar se sed imprimisse apenas as linhas onde as substituições ocorreram. Para conseguir isso, precisamos adicionar outra flag adicional p:

Manipulate Text with Sed 4

Diferenciação de Maiúsculas e Minúsculas

Por padrão, todas as sed operações diferenciam maiúsculas de minúsculas. O comando a seguir demonstrará o comportamento padrão de diferenciação de maiúsculas e minúsculas:

$ echo "HELLO WORLD"

Devido à incompatibilidade de maiúsculas e minúsculas, não há alteração. Em tal situação, podemos dizer ao sed para desativar a diferenciação de maiúsculas e minúsculas. Para fazer isso, adicione a flag opcional i:

Como Substituir e Referenciar Textos

O poder do sed está principalmente em sua capacidade de usar expressões regulares. Com padrões regex mais avançados e complexos, podemos realizar muito mais. Por exemplo, podemos substituir o texto do início de um arquivo até um determinado local. Dê uma olhada na seguinte expressão:

Aqui, o caractere circunflexo (^) denota o início da linha. O operador que corresponde a qualquer caractere é representado usando o ponto final (.). O asterisco (*) é a expressão curinga, correspondendo desde o início da linha até GNU.

Outro truque interessante é usar o & símbolo. Podemos usá-lo para destacar as áreas que o sed encontra o padrão de busca:

Manipulate Text with Sed

Considerações Finais

Neste tutorial, exploramos os conceitos básicos do comando sed . Aprendemos como imprimir linhas específicas, buscar textos, excluir e substituir textos, sobrescrever textos e usar expressões regulares. Um comando sed construído corretamente pode transformar drasticamente um documento de texto. Agora você pode manipular texto com sucesso no Linux com a ajuda do sed.

Boa computação!

author

Hark Labs

Autor · CloudSigma

Preslav Dobrev é um designer criativo na CloudSigma, focado na construção de uma identidade empresarial consistente por meio de canais de marketing tradicionais e inovadores. Ele é hábil em combinar a visão artística com o marketing estratégico para criar narrativas de marca impactantes.

Comentários

Nenhum comentário ainda. Seja o primeiro.