sed
Paradigma | script |
---|---|
Projetado por | Lee E. McMahon |
Apareceu pela primeira vez | 1974 |
Linguagem de implementação | C |
Local na rede Internet | www.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 exemplod
para excluir o espaço q
de padrão, sair, N
adicionar 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 ( -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 (delete) na segunda linha de entrada (imprimindo todas as linhas, exceto a segunda), enquanto /^ /d
excluiria 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 -e
para indicar que uma expressão segue. 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 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 regexp
fornece correspondência de padrões e salva texto por meio de subexpressões, enquanto o replacement
pode ser texto literal ou uma string de formato contendo os caracteres &
para "correspondência inteira" ou as sequências de escape \1
especiais até \9
a 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 \1
no 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 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 :
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
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 -f
opçã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.sed
pode 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 chmod
comando:
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 -i
opçã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
s
comando (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 -f
ou 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
- ^
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 script
s/x/y/g
não há ambiguidade, entãogenerateData | sed s/x/y/g
funciona 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
- ^ "O FAQ do sed, Seção 2.1" . Recuperado em 21-05-2013 .
- ^ "O FAQ do sed, Seção 2.2" . Recuperado em 21-05-2013 .
- ^ 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.
- ^ 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…
- ^ "Implementação de uma máquina de Turing como script Sed" .
- ^ "Turing.sed" .
- ^ "O $SED Home - gamez" .
- ^ "bolknote/SedChess" . GitHub .
- ^ "Sedtris, um jogo de Tetris escrito para sed" .
Leitura adicional
- Oitava Edição do Bell Lab (por volta de 1985) Unix sed(1) página de manual
- Documentação do GNU sed ou a página de manual
- Dale Dougherty & Arnold Robbins (março de 1997). sed & 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 . Imprensa EHDP. ISBN 978-1-939824-00-4.
- Sourceforge.net , o sed FAQ (março de 2003)
Links externos
- The Single UNIX Specification , Edição 7 do The Open Group – Commands & Utilities Reference,
- Plano 9 , Volume 1 – Manual do Programador do
Tutoriais
- Sed - Uma Introdução e Tutorial , por Bruce Barnett
- SED -- A Non-Interactive Text Editor (1974) , por Lee E. McMahon
- Mais de 31 exemplos para o comando Sed Linux na manipulação de texto , por Mokhtar Ebrahim
Exemplos
- Principais fontes para scripts sed, arquivos, uso
- Scripts SED e Shell de Roger Chang (2012)
- Principais comandos 'sed' – Exemplos de uso Arquivado em 2018-11-10 no Wayback Machine
- Exemplos de comandos Sed em Unix e Linux
Outros links
- Página inicial do GNU sed (inclui manual do GNU sed)
- sed the Stream Editor (2004) (Eric Pement)
- grupo de discussão sed-users do Yahoo
- implementação do sed minised autor original Eric_S._Raymond , mantido por ExactCODE .
- Software multiplataforma
- Linguagens de programação de correspondência de padrões
- Linguagens de script
- Programas Unix padrão
- Linguagens de programação orientadas a texto
- Utilitários de processamento de texto Unix
- Utilitários Unix SUS2008
- Comandos do plano 9
- Comandos do IBM i Qshell
- Aplicativos de console
- Linguagens de programação criadas em 1974