sed - sed
Paradigma | script |
---|---|
Projetado por | Lee E. McMahon |
Apareceu pela primeira vez | 1974 |
Linguagem de implementação | C |
Local na rede Internet | www |
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 e está disponível hoje para a maioria dos sistemas operacionais. sed foi baseado nos recursos de script do editor interativo ed ("editor", 1971) e do qed anterior ("editor rápido", 1965–66). sed foi uma das primeiras ferramentas a oferecer suporte a 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 do Unix , sed é um dos primeiros comandos do Unix construídos para o processamento de linha de comando de arquivos de dados. Ele evoluiu como o sucessor natural do popular comando grep . A motivação original era um análogo de grep (g / re / p) para substituição, portanto, "g / re / s". Prevendo que outros programas de propósito especial para cada comando também surgissem, como g / re / d, McMahon escreveu um editor de fluxo orientado a linha de propósito geral, que se tornou sed. 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 de sed, que era de uso comum na época, e a sintaxe de expressão regular influenciou outras linguagens, notadamente ECMAScript e Perl . Posteriormente, a linguagem mais poderosa AWK se desenvolveu, e estes funcionaram como primos, permitindo que o processamento de texto poderoso fosse feito por scripts de shell . sed e AWK são freqüentemente citados como progenitores e inspiração para Perl, e influenciaram a sintaxe e 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 é minimizada , originalmente com engenharia reversa do sed 4.1BSD por Eric S. Raymond e atualmente mantida 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 do sed BSD, mas não é tão rico em recursos quanto o sed GNU. Sua vantagem é que é muito rápido e usa pouca memória. Ele é usado em sistemas embarcados e é a versão do sed fornecida com o Minix .
Modo de operação
sed é um utilitário de processamento de texto orientado por 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 . Para o espaço do padrão, o 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 exibe o espaço padrão (a linha modificada pelo script) e começa 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 exemplo, d
para excluir o espaço do padrão, q
sair, N
adicionar a próxima linha ao espaço do padrão imediatamente e assim por diante. Assim, um script sed corresponde ao corpo de um loop que itera através das linhas de um stream, onde o próprio loop e a variável de 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 ( -e
opção) ou lido de um arquivo separado ( -f
opçã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, 2d
só executaria o d
comando (excluir) na segunda linha de entrada (imprimindo todas as linhas, exceto a segunda), enquanto /^ /d
iria excluir todas as linhas que começassem com um espaço. Um buffer especial separado, o espaço de espera , pode ser usado por alguns comandos sed para manter e acumular texto entre os ciclos. a linguagem de comando do sed tem apenas duas variáveis (o "espaço de retenção" e o "espaço de padrão") e funcionalidade de ramificação semelhante a GOTO ; no entanto, a linguagem é Turing-completa e existem scripts sed esotéricos para jogos como sokoban , arkanoid , xadrez e tetris .
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, o que pode ser reformulado como uma declaraçã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 (linha de cópia para espaço de padrão, espaço de padrão de impressão) estão implícitos, é possível escrever programas concisos de uma linha . Por exemplo, o programa sed fornecido por:
10q
imprimirá as primeiras 10 linhas de entrada e, em seguida, 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:
sed 's/regexp/replacement/g' inputFileName > outputFileName
Em algumas versões do sed, a expressão deve ser precedida por -e
para indicar que uma expressão vem a seguir. O s
significa substituto, enquanto o g
significa 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 de delimitação (barra aqui) e a substituição segue o segundo símbolo. Slash ( /
) é o símbolo convencional, originado no caractere para "pesquisa" 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 de dente inclinado ".
O comando de substituição, que se origina em pesquisar e substituir no ed, implementa análise e modelos simples . O regexp
fornece tanto correspondência de padrão e texto poupança via sub-expressões, enquanto o replacement
pode ser texto literal, ou uma seqüência de formato que contém os caracteres &
para "todo jogo" ou as especiais seqüências de escape \1
através \9
do n º salvo sub-expressão. 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 primeira (e única) subexpressão salva no regexp e \1
no formato string substitui isso na saída.
Outros comandos sed
Além da substituição, outras formas de processamento simples são possíveis, usando cerca de 25 comandos sed. Por exemplo, o seguinte usa o comando d para filtrar as linhas que contêm apenas espaços ou apenas o caractere de fim de linha:
sed '/^ *$/d' inputFileName
Este exemplo usa alguns dos seguintes metacaracteres de expressão regular (sed oferece suporte a 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 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 seguidos por uma string) e a instrução de desvio b
. Uma instrução b
seguida 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 :
generateData | 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:
$ echo xyz xyz | sed 's/x/y/g'
yyz yyz
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, em seguida, usar a -f
opção de executar os comandos (como s/x/y/g
) a partir do arquivo:
sed -f subst.sed inputFileName > outputFileName
Qualquer número de comandos pode ser colocado no arquivo de script, e o uso de um arquivo de script também evita problemas com escape de shell ou substituições.
Esse arquivo de script pode ser feito diretamente executável a partir da linha de comando, acrescentando uma " linha shebang " que contém o comando sed e atribuindo a permissão executável ao arquivo. Por exemplo, um arquivo subst.sed
pode ser criado com o conteúdo:
#!/bin/sed -f
s/x/y/g
O arquivo pode então ser tornado executável pelo usuário atual com o chmod
comando:
chmod u+x subst.sed
O arquivo pode então ser executado diretamente a partir da linha de comando:
subst.sed inputFileName > outputFileName
Edição no local
A -i
opção, introduzida no GNU sed, permite a edição local de arquivos (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/' fileName
Exemplos
Olá Mundo! exemplo
# convert input text stream to "Hello, world!"
s/.*/Hello, world!/
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 são impressas. Portanto, a única saída é "Olá, mundo!".
O exemplo enfatiza muitas características principais do sed:
- Os programas típicos do sed são curtos e simples.
- Os scripts sed podem ter comentários (a linha que começa com o
#
símbolo). - O
s
comando (substituto) é o comando sed mais importante. - O 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 segue vários scripts sed; eles podem ser executados passando como um argumento para sed, ou colocados em um arquivo separado e executados via -f
ou tornando o próprio script executável.
Para substituir qualquer instância de uma determinada palavra em um arquivo por "REMODELADA", como uma senha de IRC, e salve o resultado:
sed -i s/yourpassword/REDACTED/ ./status.chat.log
Para excluir qualquer linha que contenha a palavra "sua palavra" (o endereço é '/ sua palavra /'):
/yourword/ d
Para excluir todas as ocorrências da palavra "sua palavra":
s/yourword//g
Para excluir duas palavras de um arquivo simultaneamente:
s/firstword//g
s/secondword//g
Para expressar o exemplo anterior em uma linha, como ao inserir na linha de comando, pode-se juntar dois comandos por meio do ponto-e-vírgula:
sed "s/firstword//g; s/secondword//g" inputFileName
Exemplo de processamento multilinha
No próximo exemplo, sed, que geralmente funciona apenas em uma linha, remove novas linhas de sentenças em que a segunda linha começa com um espaço. Considere o seguinte texto:
This is my dog, whose name is Frank. This is my fish, whose name is George. This is my goat, whose name is Adam.
O script sed abaixo transformará o texto acima no seguinte texto. Observe que o script afeta apenas as linhas de entrada que começam com um espaço:
This is my dog, whose name is Frank. This is my fish, whose name is George. This is my goat, whose name is Adam.
O script é:
N s/\n / / P D
Isso é explicado como:
- (
N
) adiciona a próxima linha ao espaço do 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 do padrão e execute o script novamente.
Isso pode ser expresso em uma única linha por 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 um processamento mais sofisticado, linguagens mais poderosas como AWK ou Perl são usadas em seu lugar. Eles 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 (imprimir linhas que correspondem a um padrão), head (imprimir a primeira parte de um arquivo), tail (imprimir a última parte de um arquivo) e tr (traduzir ou excluir caracteres) são frequentemente 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 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 uma funcionalidade semelhante ao sed.
Veja também
Notas
Referências
Leitura adicional
- Oitava edição do Bell Lab (por volta de 1985) Unix sed (1) página do manual
- Documentação GNU sed ou a página de manual
- Dale Dougherty & Arnold Robbins (março de 1997). sed e awk (2ª ed.). O'Reilly . ISBN 1-56592-225-5.
- Arnold Robbins (junho de 2002). sed e awk Pocket Reference (2ª ed.). O'Reilly . ISBN 0-596-00352-8.
- Peter Patsis (dezembro de 1998). UNIX AWK e SED Programmer's Interactive Workbook (UNIX Interactive Workbook) . Prentice Hall . ISBN 0-13-082675-8.
- Daniel Goldman (fevereiro de 2013). Guia definitivo para sed . EHDP Press. ISBN 978-1-939824-00-4.
- Sourceforge.net , o sed FAQ (março de 2003)
links externos
- The Single UNIX Specification , Issue 7 from The Open Group - Referência de comandos e utilitários,
- Plano 9 , Volume 1 - Manual do programador do
Tutoriais
- Sed - Uma introdução e tutorial , por Bruce Barnett
- SED - Um editor de texto não interativo (1974) , de Lee E. McMahon
- 31+ Exemplos de Comando Sed Linux em Manipulação de Texto , por Mokhtar Ebrahim
Exemplos
- Principais fontes de scripts sed, arquivos, uso
- Scripts SED e Shell de Roger Chang (2012)
- Principais comandos 'sed' - exemplos de uso
- Exemplos de comandos Sed em Unix e Linux
Outros links
- Página inicial do GNU sed (inclui o manual do GNU sed)
- sed the Stream Editor (2004) (Eric Pement)
- grupo de discussão sed-users do Yahoo