Pesquisa de site

Como usar o comando sed do Linux


Aprenda o uso básico do sed e baixe nossa folha de dicas para uma referência rápida ao editor de fluxo do Linux.

Poucos comandos Unix são tão famosos quanto sed, grep e awk. Eles são frequentemente agrupados, possivelmente porque têm nomes estranhos e ferramentas poderosas para análise de texto. Eles também compartilham algumas semelhanças sintáticas e lógicas. E embora todos sejam úteis para analisar texto, cada um tem suas especialidades. Este artigo examina o comando sed, que é um editor de fluxo.

Já escrevi antes sobre o sed, bem como sobre seu parente distante ed. Para se sentir confortável com o sed, é útil ter alguma familiaridade com o ed, porque isso ajuda você a se acostumar com a ideia de buffers. Este artigo pressupõe que você esteja familiarizado com os fundamentos do sed, o que significa que você pelo menos executou o clássico comando localizar e substituir no estilo s/foo/bar/.

[Baixe nossa folha de dicas do sed gratuitamente]

Instalando sed

Se estiver usando Linux, BSD ou macOS, você já tem o GNU ou BSD sed instalado. Estas são reimplementações exclusivas do comando sed original e, embora sejam semelhantes, existem pequenas diferenças. Este artigo foi testado nas versões Linux e NetBSD, então você pode usar qualquer sed que encontrar em seu computador neste caso, embora para BSD sed você deva usar opções curtas (-n em vez de --quiet, por exemplo).

O sed GNU é geralmente considerado o sed com mais recursos disponíveis, então você pode querer experimentá-lo esteja ou não executando o Linux. Se você não conseguir encontrar o GNU sed (frequentemente chamado de gsed em sistemas não-Linux) em sua árvore de ports, então você pode baixar seu código-fonte no site do GNU. O bom de instalar o GNU sed é que você pode usar suas funções extras, mas também restringi-lo para estar em conformidade com as especificações POSIX do sed, caso precise de portabilidade.

Os usuários do MacOS podem encontrar o GNU sed no MacPorts ou Homebrew.

No Windows, você pode instalar o GNU sed com Chocolatey.

Compreendendo o espaço padrão e o espaço de retenção

Sed funciona exatamente em uma linha por vez. Por não ter exibição visual, ele cria um espaço padrão, um espaço na memória contendo a linha atual do fluxo de entrada (com qualquer caractere de nova linha removido). Depois de preencher o espaço padrão, o sed executa suas instruções. Quando chega ao final dos comandos, sed imprime o conteúdo do espaço padrão no fluxo de saída. O fluxo de saída padrão é stdout, mas a saída pode ser redirecionada para um arquivo ou até mesmo de volta para o mesmo arquivo usando a opção --in-place=.bak.

Então o ciclo começa novamente com a próxima linha de entrada.

Para fornecer um pouco de flexibilidade enquanto você percorre arquivos com o sed, o sed também fornece um espaço de espera (às vezes também chamado de buffer de espera), um espaço na memória do sed reservado para uso temporário. armazenamento de dados. Você pode pensar no espaço de espera como uma área de transferência e, na verdade, é exatamente isso que este artigo demonstra: como copiar/recortar e colar com sed.

Primeiro, crie um arquivo de texto de amostra com este texto como conteúdo:

Line one
Line three
Line two

Copiando dados para armazenar espaço

Para colocar algo no espaço de espera do sed, use o comando h ou H. Um h minúsculo diz ao sed para substituir o conteúdo atual do espaço de espera, enquanto um H maiúsculo diz para anexar dados a tudo o que já está no espaço de espera.

Usado sozinho, não há muito para ver:

$ sed --quiet -e '/three/ h' example.txt
$

A opção --quiet (-n para abreviar) suprime toda a saída, exceto o que sed executou para meus requisitos de pesquisa. Neste caso, sed seleciona qualquer linha contendo a string três e a copia para manter o espaço. Eu não disse ao sed para imprimir nada, então nenhuma saída é produzida.

Copiando dados do espaço de espera

Para obter algumas informações sobre o espaço de espera, você pode copiar seu conteúdo do espaço de espera e colocá-lo no espaço padrão com o comando g. Veja o que acontece:

$ sed -n -e '/three/h' -e 'g;p' example.txt

Line three
Line three

A primeira linha em branco é impressa porque o espaço de espera está vazio quando é copiado pela primeira vez no espaço padrão.

As próximas duas linhas contêm Linha três porque é isso que está no espaço de espera da linha dois em diante.

Este comando usa dois scripts exclusivos (-e) exclusivamente para ajudar na legibilidade e organização. Pode ser útil dividir etapas em scripts individuais, mas tecnicamente este comando funciona tão bem quanto uma instrução de script:

$ sed -n -e '/three/h ; g ; p' example.txt

Line three
Line three

Anexando dados ao espaço padrão

O comando G anexa um caractere de nova linha e o conteúdo do espaço de espera ao espaço padrão.

$ sed -n -e '/three/h' -e 'G;p' example.txt
Line one

Line three
Line three
Line two
Line three

As duas primeiras linhas desta saída contêm o conteúdo do espaço padrão (Linha um) e o espaço de espera vazio. As próximas duas linhas correspondem ao texto de pesquisa (três), portanto contém o espaço padrão e o espaço de espera. O espaço de espera não muda para o terceiro par de linhas, então o espaço padrão (Linha dois) é impresso com o espaço de espera (ainda Linha três) no final .

Fazendo recortar e colar com sed

Agora que você sabe como fazer malabarismos com uma string de padrão para reter espaço e vice-versa, você pode criar um script sed que copia, exclui e cola uma linha em um documento. Por exemplo, o arquivo de exemplo deste artigo tem a Linha três fora de ordem. Sed pode consertar isso:

$ sed -n -e '/three/ h' -e '/three/ d' \
-e '/two/ G;p' example.txt
Line one
Line two
Line three
  • O primeiro script encontra uma linha contendo a string três e a copia do espaço padrão para o espaço de retenção, substituindo qualquer coisa atualmente no espaço de retenção.
  • O segundo script exclui qualquer linha que contenha a string três. Isso completa o equivalente a uma ação cortar em um processador de texto ou editor de texto.
  • O script final encontra uma linha contendo dois e anexa o conteúdo do espaço de espera ao espaço padrão e então imprime o espaço padrão.

Tarefa concluída.

Script com sed

Mais uma vez, o uso de instruções de script separadas é puramente para simplicidade visual e mental. O comando recortar e colar funciona como um script:

$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt
Line one
Line two
Line three

Pode até ser escrito como um arquivo de script dedicado:

#!/usr/bin/sed -nf

/three/h
/three/d
/two/ G
p

Para executar o script, marque-o como executável e experimente em seu arquivo de amostra:

$ chmod +x myscript.sed
$ ./myscript.sed example.txt
Line one
Line two
Line three

Obviamente, quanto mais previsível for o texto que você precisa analisar, mais fácil será resolver seu problema com o sed. Geralmente não é prático inventar "receitas" para ações sed (como copiar e colar) porque a condição para acionar a ação provavelmente é diferente de arquivo para arquivo. No entanto, quanto mais fluente você se tornar com os comandos do sed, mais fácil será planejar ações complexas com base na entrada que você precisa analisar.

O importante é reconhecer ações distintas, entender quando sed passa para a próxima linha e prever o que o padrão e o espaço de espera devem conter.

Baixe a folha de dicas

Sed é complexo. Ele possui apenas uma dúzia de comandos, mas sua sintaxe flexível e seu poder bruto significam que ele está cheio de um potencial infinito. Eu costumava fazer referência a páginas de frases simples na tentativa de aproveitar ao máximo o sed, mas foi só quando comecei a inventar (e às vezes a reinventar) minhas próprias soluções que senti que estava começando a na verdade aprenda sed. Se você está procurando lembretes gentis de comandos e dicas úteis sobre sintaxe, baixe nossa folha de dicas do sed e comece a aprender o sed de uma vez por todas!