sed

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar
sed
Paradigmascript
Projetado porLee E. McMahon
Apareceu pela primeira vez1974 ; 48 anos atrás ( 1974 )
Linguagem de implementaçãoC
Local na rede Internetwww.gnu.org/software/sed/ _ _ _ _ _
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. O sed foi desenvolvido de 1973 a 1974 por Lee E. McMahon da Bell Labs , [1] e está disponível hoje para a maioria dos sistemas operacionais. [2] o sed foi baseado nos recursos de script do editor interativo ed ("editor", 1971) e do anterior qed ("editor rápido", 1965-66). sed 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"AWK e Perl .

História

Aparecendo pela primeira vez na versão 7 do Unix , [3] sed é um dos primeiros comandos do Unix construídos para processamento de linha de comando de arquivos de dados. Ele evoluiu como o sucessor natural do comando grep popular. [4] A motivação original era um análogo de grep (g/re/p) para substituição, daí "g/re/s". [3] Prevendo que outros programas de propósito especial para cada comando também surgiriam, como g/re/d, McMahon escreveu um editor de fluxo orientado a linhas de propósito geral, que se tornou o sed. [4] A sintaxe para sed, notadamente o uso de /para correspondência de padrões e s///para substituição, originou-se com ed, o precursor do sed, que era de uso comum na época, [4] e a sintaxe de expressão regular influenciou outras linguagens, notadamente ECMAScript e Perl . Mais tarde, a linguagem mais poderosa AWK foi desenvolvida, e estas funcionavam como primos, permitindo que o processamento de texto poderoso fosse feito por scripts de shell . sed e AWK são frequentemente citados como progenitores e inspiração para Perl, e influenciaram a sintaxe e a semântica de Perl, notavelmente 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 minised atual contém algumas extensões para o BSD sed, mas não é tão rico em recursos quanto o GNU sed. Sua vantagem é que é muito rápido e usa pouca memória. [citação necessária ]É usado em sistemas embarcados e é a versão do sed fornecida com oMinix. [ citação necessária ]

Modo de operação

sed é um utilitário de processamento de texto orientado a linha: ele lê texto, linha por linha, de um fluxo de entrada ou arquivo, em um buffer interno chamado espaço de padrão . Cada linha lida inicia um ciclo . Ao espaço de padrões, sed aplica uma ou mais operações que foram especificadas por meio de um script sed . O sed implementa uma linguagem de programação com cerca de 25 comandos que especificam as operações no texto. Para cada linha de entrada, depois de executar o script, o sed normalmente gera o espaço de 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 por meio de opções sed e comandos de script, por exemplodpara excluir o espaço qde padrão, sair, Nadicionar a próxima linha ao espaço de 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) sã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, 2dsó executaria o dcomando (delete) 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 tem apenas duas variáveis ​​(o "espaço de espera" e o "espaço de padrão") e GOTO-como funcionalidade de ramificação; no entanto, a linguagem é Turing-complete , [5] [6] e existem scripts esotéricos de sed 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. As linhas de um script sed são, cada uma, 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 de padrão e espaço de retenção), fluxos de entrada e saída e ações padrão (copiar linha para espaço de padrão, espaço de padrão de impressão) estão implícitos, é possível escrever programas de uma linha concisos . Por exemplo, o programa sed dado por:

10q

imprimirá as primeiras 10 linhas de entrada e, em seguida, irá 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. O ssignifica substituto, enquanto o 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. A barra ( /) é o símbolo convencional, originado no caractere para "pesquisar" em ed, mas qualquer outro poderia ser usado para tornar a sintaxe mais legível se não ocorrer 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 search-and-replace in ed, implementa análise simples e modelagem . O regexpfornece correspondência de padrões e salva texto por meio de subexpressões, enquanto o replacementpode ser texto literal ou uma string de formato contendo os caracteres &para "correspondência inteira" ou as sequências de escape \1 especiais até \9a n -ésima subexpressão salva. Por exemplo, sed -r "s/(cat|dog)s?/\1s/g"substitui todas as ocorrências de "gato" ou "cachorro" por "gatos" ou "cachorros", 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 do 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 as linhas que contêm apenas espaços ou que contêm apenas o caractere de final 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 acento circunflexo ( ^) corresponde ao início da linha.
  • O cifrão ( $) corresponde ao final da linha.
  • O asterisco ( *) corresponde a zero ou mais ocorrências do caractere anterior.
  • O sinal de mais ( +) corresponde a uma ou mais ocorrências do caractere anterior.
  • O ponto de interrogação ( ?) corresponde a zero ou uma ocorrência do caractere anterior.
  • O ponto ( .) corresponde exatamente a um caractere.

Construções sed complexas 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 seguidos de uma string) e da instrução de desvio b. Uma instrução bseguida por um nome de rótulo válido moverá o processamento para o bloco seguinte a esse rótulo.

sed usado como filtro

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

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

Ou seja, um programa como "generateData" gera dados e, em seguida, 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 subst.sed, e então usar a -fopção para executar os comandos (como s/x/y/g) do arquivo:

sed -f subst.sed inputFileName > outputFileName

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 se tornar executável diretamente a partir da linha de comando, anexando-o com 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/a/g

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

chmod u+x subst.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/' nomedoarquivo

Exemplos

Olá Mundo! exemplo

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

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

O exemplo enfatiza muitas características-chave do sed:

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

Outros exemplos simples

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

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

sed -is/suasenha/REDIGIDO/ ./status.chat.log

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

/sua palavra/ 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/firstword//g; s/secondword//g" inputFileName

Exemplo de processamento multilinha

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

Este é o meu cachorro,
 cujo nome é Franco.
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 é o meu cão, cujo nome é Frank.
Este é o meu peixe,
cujo nome é Jorge.
Este é o meu bode, cujo nome é Adam.

O roteiro é:

N
 s/\n / /
 P
 D

Isso é explicado como:

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

Isso pode ser expresso em uma única linha via ponto e vírgula:

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

Limitações e alternativas

Embora simples e limitado, o sed é suficientemente poderoso para um grande número de propósitos. Para processamento mais sofisticado, linguagens mais poderosas, como AWK ou Perl , são usadas. Estes são particularmente usados ​​se transformar uma linha de uma maneira 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 correspondentes 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) muitas vezes são preferíveis. Para as tarefas específicas para as quais são projetados, esses utilitários especializados são geralmente mais simples, mais claros e mais 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 para ed/sed é sam /ssam, onde sam é o editor do Plan 9 e ssam é uma interface de fluxo para ele, produzindo uma funcionalidade semelhante ao sed.

Veja também

Notas

  1. ^ No uso da linha de comando, as aspas em torno da expressão não são necessárias e são necessárias apenas se o shell não interpretar a expressão como uma única palavra (token). Para o scripts/x/y/gnão há ambiguidade, entãogenerateData | sed s/x/y/gfunciona corretamente. No entanto, as aspas geralmente são incluídas para maior clareza e geralmente são necessárias, principalmente para espaços em branco (por exemplo,'s/x x/y y/'). Na maioria das vezes, aspas simples são usadas, 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 FAQ do sed, Seção 2.1" . Recuperado em 21-05-2013 .
  2. ^ "O FAQ do sed, Seção 2.2" . Recuperado em 21-05-2013 .
  3. ^ a b McIlroy, MD (1987). Um leitor de Research Unix: trechos anotados do Manual do Programador, 1971–1986 (PDF) (Relatório técnico). CSTR. Laboratórios Bell. 139.
  4. ^ a b c d "On the Early History and Impact of Unix" . Pouco depois, surgiu a demanda por outro programa especial, gres, para substituição: g/re/s. Lee McMahon se comprometeu a escrevê-lo e logo previu que não haveria fim para a família: g/re/d, g/re/a, etc. À medida que seu conceito se desenvolveu, tornou-se sed…
  5. ^ "Implementação de uma máquina de Turing como script Sed" .
  6. ^ "Turing.sed" .
  7. ^ "O $SED Home - gamez" .
  8. ^ "bolknote/SedChess" . GitHub .
  9. ^ "Sedtris, um jogo de Tetris escrito para sed" .

Leitura adicional

Links externos

Tutoriais

Exemplos

Outros links

0.077028036117554