Aprenda a usar o editor de texto Sed
O Sed não possui as caixas de texto usuais e, em vez disso, escreve diretamente em um arquivo, direcionado por comandos do usuário.
Criado para a versão 7 do sistema operacional Unix original da AT&T, o comando sed
foi incluído provavelmente em todos os sistemas operacionais Unix e Linux desde então. O aplicativo sed
é um editor de fluxo e, diferentemente de um editor de texto, ele não abre um buffer visual no qual os dados de um arquivo são carregados para processamento. Em vez disso, ele opera em um arquivo, linha por linha, de acordo com um comando digitado em um terminal ou uma série de comandos em um script.
Instalando
Se você estiver usando Linux, BSD ou macOS, então você já tem o GNU ou BSD sed
instalado. Essas são duas reimplementações exclusivas do comando sed
original e, embora sejam semelhantes, podem haver pequenas diferenças. GNU sed
é geralmente considerado o sed
mais rico em recursos que existe e está amplamente disponível em qualquer uma dessas plataformas.
Se você não conseguir encontrar o sed
do GNU (frequentemente chamado de gsed
em sistemas não-Linux), você poderá fazer o download do código-fonte no site do GNU. O bom de ter o GNU sed
instalado é que ele pode ser usado para suas funções extras, mas também pode ser restringido para estar em conformidade apenas com as especificações POSIX do sed
, caso você precisa de portabilidade.
No Windows, você pode instalar o GNU sed
com o Chocolatey.
Como funciona o Sed
O aplicativo sed
funciona 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 que o espaço padrão for preenchido, suas instruções para sed
serão executadas. Às vezes, seus comandos são condicionais e outras vezes são absolutos; portanto, os resultados desses comandos dependem de como você está usando o sed
.
Quando o final dos comandos é alcançado, sed
imprime o conteúdo do espaço padrão no fluxo de saída. O fluxo de saída padrão é stdout, mas pode ser redirecionado 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.
A sintaxe do comando sed
é:
$ sed --options [optional SCRIPT] [INPUT FILE or STREAM]
Encontrando o que você deseja editar
Em um editor visual, você geralmente localiza o que deseja alterar em um arquivo de texto sem pensar muito a respeito. Seu olho (ou leitor de tela) examina o texto, encontra a palavra que deseja alterar ou o local onde deseja inserir ou remover o texto e então você simplesmente começa a digitar. Porém, não existe um modo interativo para sed
, então você deve informar quais condições devem ser atendidas para que ele execute comandos específicos.
Para estes exemplos, suponha que um arquivo chamado example.txt
contenha este texto:
hello
world
This is line three.
Here is the final line.
Número da linha
Especificar um número de linha diz ao sed
para operar apenas naquela linha específica do arquivo.
Por exemplo, este comando seleciona a linha 1 de um arquivo e a imprime. Como a ação padrão do sed
após o processamento também é imprimir uma linha em stdout, isso tem o efeito de duplicar a primeira linha:
$ sed ‘1p’ example.txt
hello
hello
world
This is line three.
Here is the final line.
Você também pode especificar números de linha em etapas. Por exemplo, 1~2
indica que cada 2 linhas são selecionadas ("selecione cada segunda linha começando pela primeira"). A instrução 1~3
significa selecionar cada terceira linha após a primeira:
$ sed ‘1p’ example.txt
hello
hello
world
This is line three.
Here is the final line.
Here is the final line.
Posição da linha
Você pode operar apenas na última linha de um arquivo usando $
como seletor:
$ sed ‘$p’ example.txt
hello
world
This is line three.
Here is the final line.
Here is the final line.
No GNU sed
, você pode selecionar mais de uma linha (sed '1,$p'
imprime a primeira e a última linha, por exemplo).
Negação
Qualquer seleção por número ou posição pode ser invertida com o caractere de ponto de exclamação (!
). Isso seleciona todas as linhas exceto a primeira linha:
$ sed ‘1!p’ example.txt
hello
world
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.
Correspondência de padrões
Você pode pensar em uma correspondência de padrão como uma operação de localização em um processador de texto ou navegador. Você fornece uma palavra (um padrão) e os resultados são selecionados. A sintaxe para uma correspondência de padrão é /pattern/
.
$ sed ‘/hello/p’ example.txt
hello
hello
world
This is line three.
Here is the final line.
$ sed ‘/line/p’ example.txt
hello
world
This is line three.
This is line three.
Here is the final line.
Here is the final line.
Editando com Sed
Depois de encontrar o que deseja editar, você pode realizar qualquer ação que desejar. Você realiza edições com sed
com comandos. Os comandos em sed
são diferentes do próprio comando sed
. Se ajudar, pense neles como “ações” ou “verbos” ou “instruções”.
Os comandos em sed
são letras únicas, como o comando p
para print usado nos exemplos anteriores. Eles podem ser difíceis de lembrar no início, mas como tudo, você os conhecerá com a prática.
p para impressão
A instrução p
imprime tudo o que está atualmente contido no espaço padrão.
d para excluir
A instrução d
exclui o espaço padrão.
$ sed ‘$d’ example.txt
hello
world
This is line three.
$ sed ‘1d’ example.txt
world
This is line three.
Here is the final line.
s para pesquisar e substituir
O comando s
procura um padrão e o substitui por outro. Este é provavelmente o uso mais popular e casual do sed
, e geralmente é o primeiro (e às vezes o único) comando sed
que um usuário aprende. É quase certamente o comando mais útil para edição de texto.
$ sed ‘s/world/opensource.com/’
hello
opensource.com
This is line three.
Here is the final line.
Existem funções especiais que você também pode usar no texto de substituição. Por exemplo, \L
transforma o texto de substituição em letras minúsculas e \l
faz o mesmo apenas para o próximo caractere. Existem outros, que estão listados na documentação do sed
(você pode ver isso com o comando info sed
).
O caractere especial &
na cláusula de substituição refere-se ao padrão correspondente:
$ sed ‘s/is/\U&/’ example.txt
hello
world
ThIS is line three.
Here IS the final line.
Você também pode transmitir sinalizações especiais para afetar o modo como s
processa o que encontra. O sinalizador g
(para global, presumivelmente) informa a s
para aplicar a substituição a todas as correspondências encontradas na linha e não apenas à primeira correspondência:
$ sed ‘s/is/\U&/g’ example.txt
hello
world
ThIS IS line three.
Here IS the final line.
Outros sinalizadores importantes incluem um número para indicar qual ocorrência de um padrão correspondente será afetada:
$ sed ‘s/is/\U&/2’ example.txt
hello
world
This IS line three.
Here is the final line.
O sinalizador w
, seguido por um nome de arquivo, grava uma linha correspondente em um arquivo somente se uma alteração for feita:
$ sed ‘s/is/\U&/w sed.log’ example.txt
hello
world
ThIS is line three.
Here IS the final line.
$ cat sed.log
ThIS is line three.
Here IS the final line.
As bandeiras podem ser combinadas:
$ sed ‘s/is/\U&/2w sed.log’ example.txt
hello
world
This IS line three.
Here is the final line.
$ cat sed.log
This IS line three.
Roteiros
Existem muitos sites excelentes com sed
"one-liners". Eles fornecem comandos sed
orientados a tarefas para resolver problemas comuns. No entanto, aprender sed
por si mesmo permite que você escreva suas próprias frases de efeito, e elas podem ser adaptadas às suas necessidades específicas.
Scripts para sed
podem ser escritos como linhas em um terminal ou podem ser salvos em um arquivo e executados com o próprio sed
. Tenho tendência a escrever pequenos scripts como um único comando porque raramente reutilizo comandos sed
na vida real. Quando escrevo um script sed
, ele geralmente é muito específico para um arquivo. Por exemplo, depois de escrever o rascunho inicial deste artigo, usei sed
para padronizar a capitalização de "sed", e essa é uma tarefa que provavelmente nunca mais terei que fazer.
Você pode emitir uma série de comandos distintos para sed
separados por ponto e vírgula (;
).
$ sed ‘3t ; s/line/\U&/’ example.txt
hello
world
This is LINE three.
This is the final line.
Mudanças de escopo com colchetes
Você também pode limitar quais resultados são afetados com chaves ({}
). Quando você coloca comandos sed
entre colchetes, eles se aplicam apenas a uma seleção específica. Por exemplo, a palavra “linha” aparece em duas linhas do texto de exemplo. Você pode forçar o sed
a afetar apenas a linha final declarando a condição de correspondência necessária ($
para indicar a linha final) e colocando o comando s
você deseja que seja executado entre colchetes imediatamente depois:
$ sed ‘$ {s/line/\U&/}’ example.txt
hello
world
This is line three.
This is the final LINE.
Aprenda Sed
Você pode fazer muito mais com sed
do que o explicado neste artigo. Ainda nem cheguei à ramificação (b
), aos testes (t
), ao hold espaço (H
) e muitos outros recursos. Assim como ed
, sed
provavelmente não é o editor de texto que você usará para criar documentos ou mesmo para todas as tarefas com script que você precisa realizar, mas é uma opção poderosa você tem como usuário POSIX. Aprender como os comandos sed
são estruturados e como escrever scripts curtos pode resultar em mudanças rápidas em grandes quantidades de texto. Leia as páginas info
do GNU sed
ou as páginas man do BSD sed
e descubra o que sed
pode fazer por você.