sed

sed
Paradigmascript
Projetado porLee E. McMahon
Apareceu pela primeira vez1974 ; 50 anos atrás ( 1974 )
Linguagem de implementaçãoC
Influenciado por
Ed
Influenciado
Perl , AWK

sed ("editor de fluxo") é um utilitário Unix que analisa e transforma texto, usando uma linguagem de programação simples e compacta. Foi desenvolvido de 1973 a 1974 por Lee E. McMahon do Bell Labs , [1] e está disponível hoje para a maioria dos sistemas operacionais. [2] sed foi baseado nos recursos de script do editor interativo ed ("editor", 1971) e do anterior qed ("editor rápido", 1965–66). Foi uma das primeiras ferramentas a suportar expressões regulares e continua em uso para processamento de texto, principalmente com o comando de substituição. Ferramentas alternativas populares para manipulação de strings de texto simples e "edição de fluxo" incluem AWK e Perl .

História

Aparecendo pela primeira vez na versão 7 Unix , [3] sed é um dos primeiros comandos Unix construídos para processamento de linha de comando de arquivos de dados. Ele evoluiu como o sucessor natural do popular comando grep . [4] A motivação original era análoga ao grep (g/re/p) para substituição, daí "g/re/s". [3] Prevendo que também surgiriam outros programas de propósito especial para cada comando, como g/re/d, McMahon escreveu um editor de fluxo orientado a linhas de uso geral, que se tornou sed. [4] A sintaxe para sed, notadamente o uso de /for pattern match e s///for replacement, originou-se com ed , o precursor de sed, que era de uso comum na época, [4] e a sintaxe da expressão regular influenciou outras linguagens , notadamente ECMAScript e Perl . Mais tarde, desenvolveu-se a linguagem mais poderosa AWK , e estas funcionavam como primas, permitindo que processamento poderoso de texto fosse feito por shell scripts . sed e AWK são frequentemente citados como progenitores e inspiração para Perl, e influenciaram a sintaxe e a semântica do Perl, notadamente nos operadores de correspondência e substituição.

GNU sed adicionou vários novos recursos, incluindo edição de arquivos no local. Super-sed é uma versão estendida do sed que inclui expressões regulares compatíveis com Perl . Outra variante do sed é o minised , originalmente com engenharia reversa do 4.1BSD sed por Eric S. Raymond e atualmente mantido por René Rebe . minised foi usado pelo Projeto GNU até que o Projeto GNU escreveu uma nova versão do sed baseada na nova biblioteca de expressões regulares GNU. O atual minisado contém algumas extensões para o BSD sed, mas não é tão rico em recursos quanto o GNU sed. A vantagem é que é muito rápido e utiliza pouca memória. [ carece de fontes ] É usado em sistemas embarcados e é a versão do sed fornecida com o Minix . [ carece de fontes ]

Modo de operação

sed é um utilitário de processamento de texto orientado a linhas: ele lê texto, linha por linha, de um fluxo de entrada ou arquivo, em um buffer interno chamado espaço padrão . Cada linha lida inicia um ciclo . Ao espaço padrão, sed aplica uma ou mais operações que foram especificadas por meio de um script sed . sed implementa uma linguagem de programação com cerca de 25 comandos que especificam as operações no texto. Para cada linha de entrada, após executar o script, sed normalmente gera o espaço padrão (a linha modificada pelo script) e inicia o ciclo novamente com a próxima linha. Outros comportamentos de fim de script estão disponíveis através de opções sed e comandos de script, por exemplo, dpara excluir o espaço padrão, qsair, Nadicionar a próxima linha ao espaço padrão imediatamente e assim por diante. Assim, um script sed corresponde ao corpo de um loop que itera pelas linhas de um fluxo, onde o próprio loop e a variável do loop (o número da linha atual) estão implícitos e mantidos pelo sed.

O script sed pode ser especificado na linha de comando ( -eopção) ou lido de um arquivo separado ( -fopção). Os comandos no script sed podem ter um endereço opcional, em termos de números de linha ou expressões regulares . O endereço determina quando o comando é executado. Por exemplo, 2dexecutaria apenas o dcomando (excluir) na segunda linha de entrada (imprimindo todas as linhas, exceto a segunda), enquanto /^ /dexcluiria todas as linhas começando com um espaço. Um buffer especial separado, o hold space , pode ser usado por alguns comandos sed para armazenar e acumular texto entre os ciclos. A linguagem de comando do sed possui apenas duas variáveis ​​(o "espaço de espera" e o "espaço de padrão") e funcionalidade de ramificação semelhante a GOTO ; no entanto, a linguagem é Turing-completa , [5] [6] e existem scripts sed esotéricos para jogos como sokoban , arkanoid , [7] xadrez , [8] e tetris . [9]

Um loop principal é executado para cada linha do fluxo de entrada, avaliando o script sed em cada linha da entrada. Cada linha de um script sed é um par padrão-ação, indicando qual padrão corresponder e qual ação executar, que pode ser reformulada como uma instrução condicional . Como o loop principal, variáveis ​​de trabalho (espaço padrão e espaço de espera), fluxos de entrada e saída e ações padrão (copiar linha para espaço padrão, imprimir espaço padrão) estão implícitos, é possível escrever programas concisos de uma linha . Por exemplo, o programa sed dado por:

10q

imprimirá as primeiras 10 linhas de entrada e depois parará.

Uso

Comando de substituição

O exemplo a seguir mostra um uso típico e mais comum de sed: substituição. Este uso foi de fato a motivação original para sed: [4]

sed 's/regexp/replacement/g' inputFileName > outputFileName
    

Em algumas versões do sed, a expressão deve ser precedida por -epara indicar que uma expressão segue. The ssignifica substituto, enquanto the gsignifica global, o que significa que todas as ocorrências correspondentes na linha seriam substituídas. A expressão regular (ou seja, padrão) a ser pesquisada é colocada após o primeiro símbolo delimitador (barra aqui) e a substituição segue o segundo símbolo. Barra ( /) é o símbolo convencional, originado no caractere de “pesquisa” em ed, mas qualquer outro poderia ser usado para tornar a sintaxe mais legível caso não ocorra no padrão ou substituição; isso é útil para evitar a " síndrome do palito inclinado ".

O comando de substituição, que se origina em pesquisar e substituir em ed, implementa análise e modelagem simples . O regexpfornece correspondência de padrões e salvamento de texto por meio de subexpressões, enquanto replacementpode ser texto literal ou uma string de formato contendo os caracteres &para "correspondência inteira" ou as sequências de escape \1 especiais para \9a enésima subexpressão salva. Por exemplo, sed -r "s/(cat|dog)s?/\1s/g"substitui todas as ocorrências de "cat" ou "dog" por "cats" ou "dogs", sem duplicar um "s" existente: (cat|dog)é a 1ª (e única) subexpressão salva na regexp, e \1no formato string substitui isso na saída.

Outros comandos sed

Além da substituição, outras formas de processamento simples são possíveis, utilizando cerca de 25 comandos sed. Por exemplo, o seguinte usa o comando d para filtrar linhas que contêm apenas espaços ou contêm apenas o caractere de fim de linha:

sed '/^ *$/d' inputFileName
  

Este exemplo usa alguns dos seguintes metacaracteres de expressão regular (sed suporta toda a gama de expressões regulares):

  • O sinal de intercalação ( ^) corresponde ao início da linha.
  • O cifrão ( $) corresponde ao final da linha.
  • O asterisco ( *) corresponde a zero ou mais ocorrências do caracter anterior.
  • O sinal de mais ( +) corresponde a uma ou mais ocorrências do caractere anterior.
  • O ponto de interrogação ( ?) corresponde a zero ou a uma ocorrência do caractere anterior.
  • O ponto ( .) corresponde exatamente a um caractere.

Construções complexas do sed são possíveis, permitindo que ele sirva como uma linguagem de programação simples, mas altamente especializada . O fluxo de controle, por exemplo, pode ser gerenciado pelo uso de um rótulo (dois pontos seguido por uma string) e a instrução de desvio b, bem como o desvio condicional t. Uma instrução bseguida por um nome de rótulo válido moverá o processamento para o comando seguinte a esse rótulo. A tinstrução só o fará se houver uma substituição bem sucedida desde a anterior t(ou o início do programa, no caso da primeira tencontrada). Além disso, a {instrução inicia uma subsequência de comandos (até o correspondente }); na maioria dos casos, será condicionado por um padrão de endereço.

sed usado como filtro

No Unix, sed é frequentemente usado como filtro em um pipeline :

$ gerarDados | sed 's/x/y/g'   

Ou seja, um programa como "generateData" gera dados e então sed faz a pequena alteração de substituir x por y . Por exemplo:

$ eco  xyz  xyz | sed 's/x/y/g' yyz yyz   

[notas 1]

Scripts sed baseados em arquivo

Muitas vezes é útil colocar vários comandos sed, um comando por linha, em um arquivo de script como e subst.sed, em seguida, usar a -fopção para executar os comandos (como s/x/y/g) a partir do arquivo:

sed  -f  subst.sed  nome do arquivo de entrada  >  nome do arquivo de saída

Qualquer número de comandos pode ser colocado no arquivo de script, e usar um arquivo de script também evita problemas com escape ou substituições de shell.

Esse arquivo de script pode ser executado diretamente a partir da linha de comando, acrescentando-o uma " linha shebang " contendo o comando sed e atribuindo a permissão executável ao arquivo. Por exemplo, um arquivo subst.sedpode ser criado com conteúdo:

#!/bin/sed -f 
s / x / y / g

O arquivo pode então se tornar executável pelo usuário atual com o chmodcomando:

chmod  u+x  substituído.sed

O arquivo pode então ser executado diretamente da linha de comando:

subst.sed  inputFileName  >  outputFileName

Edição no local

A -iopção, introduzida no GNU sed, permite a edição de arquivos no local (na verdade, um arquivo de saída temporário é criado em segundo plano e, em seguida, o arquivo original é substituído pelo arquivo temporário). Por exemplo:

sed  -i 's/abc/def/' nome do arquivo
  

Exemplos

Olá Mundo! exemplo

# converte o fluxo de texto de entrada em "Olá, mundo!" 
s /.*/ Olá , mundo ! / q

Este "Olá, mundo!" script está em um arquivo (por exemplo, script.txt) e é invocado com sed -f script.txt inputFileName, onde "inputFileName" é o arquivo de texto de entrada. O script altera a linha 1 de "inputFileName" para "Olá, mundo!" e então sai, imprimindo o resultado antes do sed sair. Quaisquer linhas de entrada após a linha 1 não são lidas e nem impressas. Portanto, a única saída é "Olá, mundo!".

O exemplo enfatiza muitas características principais do sed:

  • Os programas sed típicos são bastante curtos e simples.
  • Os scripts sed podem ter comentários (a linha que começa com o #símbolo).
  • O scomando (substituto) é o comando sed mais importante.
  • sed permite uma programação simples, com comandos como q(quit).
  • sed usa expressões regulares, como .*(zero ou mais de qualquer caractere).

Outros exemplos simples

Abaixo seguem vários scripts sed; eles podem ser executados passando como argumento para sed ou colocados em um arquivo separado e executados por meio de -fou tornando o próprio script executável.

Para substituir qualquer instância de uma determinada palavra em um arquivo por "REDACTED", como uma senha IRC, e salvar o resultado:

$ sed  -i "s/suasenha/REDIGIDO/" ./status.chat.log
  

Para excluir qualquer linha que contenha a palavra "suapalavra" (o endereço é '/suapalavra/'):

/ suapalavra / d 

Para excluir todas as ocorrências da palavra "suapalavra":

s / sua palavra // g

Para excluir duas palavras de um arquivo simultaneamente:

s / primeira palavra // g 
s / segunda palavra // g

Para expressar o exemplo anterior em uma linha, como ao entrar na linha de comando, pode-se juntar dois comandos através do ponto e vírgula:

$ sed "s/primeira palavra//g; s/segunda palavra //g" inputFileName
  

Exemplo de processamento multilinha

No próximo exemplo, sed, que normalmente funciona apenas em uma linha, remove novas linhas de frases onde a segunda linha começa com um espaço. Considere o seguinte texto:

Este é o meu cachorro,
 cujo nome é Frank.
Este é o meu peixe,
cujo nome é Jorge.
Esta é minha cabra,
 cujo nome é Adão.

O script sed abaixo transformará o texto acima no texto a seguir. Observe que o script afeta apenas as linhas de entrada que começam com um espaço:

Este é meu cachorro, cujo nome é Frank.
Este é o meu peixe,
cujo nome é Jorge.
Esta é minha cabra, cujo nome é Adam.

O roteiro é:

 N 
s / \n / / P D  
 
 

Isso é explicado como:

  • ( N) adicione a próxima linha ao espaço padrão;
  • ( s/\n / /) encontrar uma nova linha seguida de um espaço, substituir por um espaço;
  • ( P) imprime a linha superior do espaço padrão;
  • ( D) exclua a linha superior do espaço padrão e execute o script novamente.

Isso pode ser expresso em uma única linha por meio de ponto e vírgula:

sed ' ' inputFileName
N; s/\n / /; P; D

Limitações e alternativas

Embora simples e limitado, o sed é suficientemente poderoso para um grande número de finalidades. Para um processamento mais sofisticado, são usadas linguagens mais poderosas, como AWK ou Perl . Eles são particularmente usados ​​​​se a transformação de uma linha for mais complicada do que uma extração de regex e substituição de modelo, embora transformações arbitrariamente complicadas sejam, em princípio, possíveis usando o buffer de retenção.

Por outro lado, para operações mais simples, utilitários Unix especializados, como grep (imprime linhas que correspondem a um padrão), head (imprime a primeira parte de um arquivo), tail (imprime a última parte de um arquivo) e tr (traduz ou exclui caracteres) são muitas vezes preferíveis. Para as tarefas específicas para as quais foram projetados, esses utilitários especializados são geralmente mais simples, claros e rápidos do que uma solução mais geral como o sed.

Os comandos e a sintaxe ed/sed continuam a ser usados ​​em programas descendentes, como os editores de texto vi e vim . Um análogo de ed/sed é sam /ssam, onde sam é o editor do Plan 9 e ssam é uma interface de fluxo para ele, produzindo funcionalidade semelhante ao sed.

Veja também

Notas

  1. ^ No uso da linha de comando, as aspas ao redor da expressão não são obrigatórias e só são necessárias se o shell não interpretar a expressão como uma única palavra (token). Para o script s/x/y/gnão há ambigüidade, então generateData | sed s/x/y/gfunciona corretamente. No entanto, as aspas são geralmente incluídas para maior clareza e muitas vezes são necessárias, principalmente para espaços em branco (por exemplo, 's/x x/y y/'). Na maioria das vezes são usadas aspas simples, para evitar que o shell seja interpretado $como uma variável do shell. Aspas duplas são usadas, como "s/$1/$2/g", para permitir que o shell substitua um argumento de linha de comando ou outra variável do shell.

Referências

  1. ^ "O sed FAQ, Seção 2.1" . Arquivado do original em 27/06/2018 . Recuperado em 21/05/2013 .
  2. ^ "Perguntas frequentes sobre o sed, Seção 2.2" . Arquivado do original em 27/06/2018 . Recuperado em 21/05/2013 .
  3. ^ ab McIlroy, DM (1987). Um leitor Research Unix: trechos anotados do Manual do Programador, 1971–1986 (PDF) (Relatório técnico). CSTR. Laboratórios Bell. 139.
  4. ^ abcd "Sobre a história inicial e o impacto do Unix" . Algum tempo depois surgiu a demanda por outro programa de propósito especial, gres, para substituição: g/re/s. Lee McMahon comprometeu-se a escrevê-lo e logo previu que não haveria fim para a família: g/re/d, g/re/a, etc.
  5. ^ "Implementação de uma máquina de Turing como script Sed" . Arquivado do original em 20/02/2018 . Recuperado em 24/04/2003 .
  6. ^ "Turing.sed" . Arquivado do original em 16/01/2018 . Recuperado em 24/04/2003 .
  7. ^ "A página inicial do $SED - gamez" .
  8. ^ "bolknote/SedChess" . Github . Recuperado em 23 de agosto de 2013 .
  9. ^ "Sedtris, um jogo de Tetris escrito para sed" . Github . Recuperado em 3 de outubro de 2016 .

Leitura adicional

  • Oitava edição do Bell Lab (por volta de 1985) Página de manual Unix sed (1)
  • Documentação sed do GNU ou a página de manual
  • Dale Dougherty e Arnold Robbins (março de 1997). sed & awk (2ª ed.). O'Reilly . ISBN 1-56592-225-5.
  • Arnold Robbins (junho de 2002). Referência de bolso sed e awk (2ª ed.). O'Reilly . ISBN 0-596-00352-8.
  • Peter Patsis (dezembro de 1998). Pasta de trabalho interativa do programador UNIX AWK e SED (pasta de trabalho interativa do UNIX) . Salão Prentice . ISBN 0-13-082675-8.
  • Daniel Goldman (fevereiro de 2013). Guia definitivo para sed. Imprensa EHDP. ISBN 978-1-939824-00-4.
  • Sourceforge.net, o FAQ do sed (março de 2003)

links externos

Obtido em "https://en.wikipedia.org/w/index.php?title=Sed&oldid=1194523414#Substitution_command"