Como Usar Sed no Linux

Uma fotografia de dois monitores de computador mostrando uma grande quantidade de código.

Sed é um programa UNIX simples que não cria nem edita arquivos. Ele apenas modifica os dados que passam pela sua entrada e apresenta os dados modificados na sua saída. Aqui, damos uma breve visão geral da filosofia UNIX, passamos pelos básicos de como usar o sed e mostramos exemplos de como usar o programa para tarefas diárias.

Índice

  • Os Básicos de Usar Sed
    1. Selecionando e Limitando Fluxos de Texto
    1. Removendo Texto de um Fluxo Sed
    1. Adicionando Novo Texto a Fluxos Sed
    1. Encontrando e Substituindo Texto no Sed
    1. Copiando Dados de Texto para o Espaço de Armazenamento
    1. Usando Rótulos para Criar Laços no Sed
    1. Fazendo Alterações Permanentes no Sed

Os Básicos de Usar Sed

Sed é um programa que pode ler e modificar fluxos de dados de texto. Isso significa que, ao contrário de um editor de texto comum, o sed não altera diretamente arquivos no seu computador. Em vez disso, ele atua mais como um “filtro” para dados que entram e permite que você os transforme da maneira que desejar.

Para começar a usar o sed, primeiro crie um arquivo com pelo menos cinco linhas de texto dentro dele. Certifique-se de que há um caractere de “nova linha” entre suas linhas:

printf"hello\nmaketecheasier\nworld\nthis\nis\nwonderful\n"> hello.txt

Nota: enquanto este guia usa um arquivo de texto de várias linhas para demonstrar o sed, todos os subcomandos do programa também funcionarão em texto que veio de pipes UNIX.

O comando geral para o sed é algo como:

sed[opção]'{script}'[arquivo de texto]

Uma das funções mais básicas do sed é o subcomando n. Ele funciona lendo dados da entrada do sed e colocando-os no “espaço de padrão” do seu programa. Este é um buffer especial que mantém qualquer texto que chega antes que o sed faça qualquer manipulação nele:

sed n hello.txt

Um terminal mostrando o conteúdo do arquivo

Outra das funções básicas do sed é o subcomando p. Semelhante ao n, ele lê os dados que entram pela entrada do sed e os coloca no espaço de padrão do programa. No entanto, ele também imprime explicitamente na saída do seu terminal.

Usar o subcomando p pode ser confuso para iniciantes, já que executá-lo com qualquer entrada de texto resulta no sed imprimindo sua saída duas vezes. Isso ocorre porque, por padrão, o sed imprime automaticamente seu espaço de padrão independentemente de o p estar presente ou não:

sed p hello.txt

Um terminal mostrando a saída do subcomando p sem a opção -n.

Para desativar esse comportamento peculiar, adicione a opção -n antes de executar seus subcomandos sed:

sed-n p hello.txt

Um terminal mostrando a saída do subcomando p com a opção -n ativada.

Com os conceitos básicos abordados, as seções seguintes irão explorar as diferentes maneiras de usar o sed para manipular dados de texto.

1. Selecionando e Limitando Fluxos de Texto

Além de imprimir, você também pode usar o sed para selecionar e limitar texto de fluxos de dados e arquivos. A maneira mais fácil de fazer isso é adicionando um valor de intervalo ao subcomando p.

O seguinte comando usa a sintaxe de intervalo do sed para imprimir a terceira à quinta linha no seu arquivo “hello.txt”:

sed-n'3,5p' hello.txt

Um terminal mostrando a capacidade do sed de imprimir intervalos de linhas específicas.

Você também pode usar o subcomando p para imprimir linhas não adjacentes no seu texto. Por exemplo, o seguinte comando imprime a primeira e a quarta linha no arquivo “hello.txt”:

sed-n'1p; 4p' hello.txt

2. Removendo Texto de um Fluxo Sed

O sed também pode deletar dados de qualquer fluxo de texto que chega. Isso é útil se você quiser remover algumas linhas de texto de um arquivo grande ou limpar a saída de um programa para mostrar apenas as informações de que precisa.

Para fazer isso, use o subcomando d juntamente com a linha específica ou intervalo que você deseja deletar:

sed-n'2d; 5d; p' hello.txt

Um terminal mostrando o processo de deletar linhas não adjacentes usando sed.

Semelhante à impressão de linhas de texto, o subcomando d funciona com intervalos de várias linhas. Por exemplo, o seguinte comando deletará as quatro primeiras linhas do arquivo “hello.txt”:

sed-n'1,4d; p' hello.txt

Além de corresponder a intervalos específicos de linhas, você pode usar expressões regulares para encontrar o texto que deseja deletar. Fazer isso dirá ao sed para procurar quaisquer linhas que contenham a palavra “world” e deletá-las:

sed-n'/world/ d; p' hello.txt

Você também pode tratar expressões regulares como um intervalo para seu arquivo de entrada. Isso lhe dá mais flexibilidade na definição de suas seleções dentro do programa:

sed-n'/world/,/wonderful/ d; p' hello.txt

Um terminal mostrando a capacidade do sed de deletar linhas de texto com base em um padrão regex.

3. Adicionando Novo Texto a Fluxos Sed

Além de deletar texto, o sed também é capaz de adicionar novo texto a fluxos de dados existentes. Embora não seja no nível de um editor de texto completo, esse recurso ainda pode ser útil para edições pontuais e adições básicas de texto.

Para adicionar uma nova linha de texto, execute o sed com o comando a seguido do texto que você deseja adicionar:

sed-ne'$a hello'-e'p' hello.txt

Um terminal mostrando o processo de adicionar uma única linha de texto ao final de um fluxo sed.

Nota: a opção -e informa ao sed que a string entre aspas após ela é uma expressão sed. Isso permite encadear várias expressões sem invocar o sed múltiplas vezes.

Também é possível incluir arquivos inteiros em um fluxo de texto do sed. Para fazer isso, use o comando r seguido do nome do arquivo que você deseja adicionar:

sed-ne'$r welcome.txt'-e'p' hello.txt

Um terminal mostrando o processo de anexar um arquivo inteiro ao final de um fluxo sed.

4. Encontrando e Substituindo Texto no Sed

Uma das características mais poderosas do sed é sua capacidade de encontrar e substituir texto em um fluxo de texto. Ao contrário de adicionar e deletar texto, isso permite que você edite os dados de forma dinâmica à medida que passam por pipes UNIX, tornando-o muito mais flexível em comparação com um editor de texto comum.

Comece testando a impressão da sua entrada de texto sem quaisquer modificações do sed:

sed-ne'p' hello.txt

Um terminal imprimindo o conteúdo do arquivo

Substitua o subcomando p por s, e adicione três barras (/) depois dele:

sed-ne's///'-e'p' hello.txt

Insira uma expressão regular estrutural da string de caracteres que você deseja corresponder entre a primeira e a segunda barra. Por exemplo, posso colocar o seguinte valor para procurar palavras que começam com “wo” na minha string de entrada:

sed-ne's/wo*.//'-e'p' hello.txt

Coloque o cursor de texto entre a segunda e a terceira barra, e forneça o texto que você deseja usar para substituir suas correspondências. Ao contrário da coluna anterior, esta seção não usa expressões regulares estruturais:

sed-ne's/wo.*/website/'-e'p' hello.txt

Por padrão, o sed substitui apenas a primeira string que corresponde em qualquer linha específica. Isso pode ser um problema se você deseja substituir todas as instâncias de uma palavra no seu fluxo de texto. Para resolver isso, adicione a opção g após a terceira barra da sua expressão:

sed-ne's/wo.*/website/g'-e'p' hello.txt

Um terminal mostrando o subcomando de substituição no sed.

5. Copiando Dados de Texto para o Espaço de Armazenamento

O sed usa dois buffers para armazenar dados de texto: o espaço de padrão e o espaço de armazenamento. O primeiro serve como um lugar temporário para seu texto enquanto passa por expressões sed. Enquanto isso, o último atua como uma área de transferência onde você pode armazenar dados de texto arbitrários.

Um benefício dessa abordagem é que permite que você “aguarde” certas saídas sem depender de programas externos. Isso pode ser útil se você planeja usar o sed para processar manipulações de texto em várias etapas.

Para começar a usar espaços de armazenamento, primeiro certifique-se de que você tem um arquivo com pelo menos algumas linhas de texto dentro dele:

sed-ne'p' hello.txt

Substitua o subcomando p por h, e então forneça um número de linha ou valor regex que o sed irá corresponder em seu arquivo. Fazer isso dirá ao sed para pegar aquela linha específica de texto e copiá-la para seu espaço de armazenamento:

sed-ne'3h' hello.txt

Nota: os dados dentro de um espaço de armazenamento não persistem entre diferentes comandos sed.

Você também pode usar o subcomando H para armazenar várias linhas de texto dentro do seu espaço de armazenamento. Por exemplo, o seguinte comando armazena a terceira e a quarta linha do meu arquivo de texto e a imprime de volta no terminal:

sed-ne'3,4H; $ {x; p}' hello.txt

Um terminal mostrando o processo de armazenar várias linhas de texto no

6. Usando Rótulos para Criar Laços no Sed

Embora o sed não seja uma linguagem de programação abrangente, ainda é possível criar laços dentro do programa. Isso é útil se você precisar de uma expressão sed que tenha que percorrer continuamente um determinado texto de entrada.

Para criar um laço no sed, você precisa primeiro fazer um rótulo para sua expressão sed. Para isso, você deve usar o subcomando : seguido do rótulo que deseja usar para sua expressão.

sed-e':x' hello.txt

Forneça os critérios de correspondência para sua expressão sed. No meu caso, quero que vá até o final de cada linha no meu texto de entrada:

sed-e':x; $' hello.txt

Digite os subcomandos sed que você deseja executar sempre que o sed encontrar uma correspondência e, em seguida, coloque-os entre chaves. O seguinte junta duas linhas adjacentes, substitui o caractere de nova linha por um espaço e depois volta ao início da expressão:

sed-e':x; /$/ {N; s/\n/ /g; bx}' hello.txt

Um terminal mostrando o processo de remoção de caracteres de nova linha usando rótulos sed em laços.

Você pode até expandir isso para corresponder quase qualquer tipo de texto de entrada. Por exemplo, o seguinte comando usa o recurso de regex estendido do sed para remover tags HTML do seu texto de entrada:

sed-re':x; s/<[^>]*>//g; {N; bx}' hello.html

Um terminal mostrando o sed removendo as tags HTML em um arquivo usando laços.

7. Fazendo Alterações Permanentes no Sed

Assim como com qualquer outra ferramenta UNIX, o sed pode aproveitar a redireção de saída e pipes. Isso não apenas permite que você junte o sed com outros programas, mas também lhe dá a oportunidade de tornar suas alterações permanentes.

A seguinte linha de código cria um novo arquivo “welcome.txt” a partir da saída do meu comando sed:

sed-ne'2p; 6p' hello.txt > hi.txt

Um terminal mostrando a capacidade do sed de usar redireção de saída para salvar sua saída em arquivos.

Além da redireção de saída, você também pode usar a opção embutida -i para editar seu arquivo atual em vez de enviar suas alterações para a saída no terminal. Por exemplo, o seguinte comando remove quaisquer caracteres de nova linha do meu arquivo de texto e o salva:

sed-ie':x; $; {N; s/\n/ /g; bx}' hello.txt

Um terminal mostrando a opção -i no sed, que permite que o programa

Se tudo isso despertou sua curiosidade sobre a linha de comando do Linux, você pode ler nosso artigo anterior onde falamos sobre alguns dos prompts Bash mais interessantes que você pode usar hoje.