Qual é o propósito de -e no comando sed?

41

Não consigo encontrar nenhuma documentação sobre o sed -ecomutador; para uma substituição simples, preciso?

por exemplo

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'
Howard
fonte
14
Tem certeza de que não encontrou isso man sed?
4
Você não encontra potongs explicação, por que não usar "cmd1; cmd2"
desconhecido usuário

Respostas:

28

Na página do manual:

-e script, --expression=script

    add the script to the commands to be executed

Portanto, você pode usar várias -eopções para criar um script de várias partes.

$ sed -e "s/foo/bar/" -e "/FOO/d"

Em primeiro lugar substituir foocom bare exclua todas as linhas contendo FOO.


fonte
3
Então, você não precisa de '-e' se tiver apenas um script, certo?
JohnyTex
Eu também estou procurando o verdadeiro propósito de-e
typelogic
27

Isso pode funcionar para você:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

Em cada caso, os comandos i(inserir), a(anexar) e c(alterar) precisam ser finalizados por uma nova linha.

Normalmente, os comandos podem ser separados por um ;exemplo, /foo/d;/bar/de agrupados por {...}, por exemplo, /foo/{h;d}mas para os i,a,ccomandos, -eé possível separar os comandos.

A alternativa é usar o shell (bash) para inserir uma nova linha:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
lcd047
fonte
1
Em pelo menos algumas implementações sed (por exemplo, no FreeBSD), você também precisa finalizar rótulos e comandos de ramificação usando novas linhas / -e, em vez de ponto e vírgula. Isso não vai funcionar: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Mas isto:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim
Não tenho certeza de quão necessária é a must be terminated with a newlinefrase que significa aqui. Quando eu testei aqui no meu cygwin, isso funciona: sed '/foo/i\bar' file. Portanto, agora que podemos fundir as expressões separadas em uma, isso levanta novamente a questão original: qual é o verdadeiro objetivo da -e?
typelogic
1

-e, equivalente a --expression, é opcional, a menos que você esteja reunindo várias expressões (não comuns), como mostrado em outra resposta .

Além: ;pode ser usado na mesma expressão para executar várias expressões uma após a outra.

flow2k
fonte
0

Na ajuda, sedvocê encontrará que -eflag significa:

 -e script, --expression=script
                 add the script to the commands to be executed

Mas você não é o primeiro a ficar confuso após o encontro -e. No seu exemplo sed 's/foo/bar/'e sed -e 's/foo/bar/'são equivalentes. Nos dois casos, s/foo/bar/o script é executado pelo sed. A segunda opção é mais explícita, mas esse provavelmente não é o motivo pelo qual você costuma ser -eusado. O motivo disso é que -epossibilita o uso de mais de um script com a mesma invocação de sed. Isso ainda deixa a questão: por que usá-lo se você estiver usando apenas um script? O exemplo a seguir pode explicar isso:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

Irá gerar "foo".

Contudo,

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

falhará porque agora sedinterpreta o primeiro s/foo/barcomo um nome de arquivo. Portanto, para facilitar a vida do futuro, você já pode começar a usar a -ebandeira hoje. Dessa forma, no futuro, você pode simplesmente acrescentar o comando com um script extra usando -e <script>.

NB Em outras respostas ;, foi sugerido o uso como alternativa ao uso de vários scripts. Embora isso seja tecnicamente possível em alguns casos, isso não é incentivado, porque rapidamente leva a códigos de leitura muito difícil. Veja um exemplo aqui: https://www.grymoire.com/Unix/Sed.html#uh-61

BakaKuna
fonte