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
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.
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
man sed
?Respostas:
Na página do manual:
Portanto, você pode usar várias
-e
opções para criar um script de várias partes.Em primeiro lugar substituir
foo
combar
e exclua todas as linhas contendoFOO
.fonte
-e
Isso pode funcionar para você:
Em cada caso, os comandos
i
(inserir),a
(anexar) ec
(alterar) precisam ser finalizados por uma nova linha.Normalmente, os comandos podem ser separados por um
;
exemplo,/foo/d;/bar/d
e agrupados por{...
}, por exemplo,/foo/{h;d}
mas para osi,a,c
comandos,-e
é possível separar os comandos.A alternativa é usar o shell (bash) para inserir uma nova linha:
fonte
-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"
must be terminated with a newline
frase que significa aqui. Quando eu testei aqui no meucygwin
, 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
?-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.fonte
Na ajuda,
sed
você encontrará que-e
flag significa:Mas você não é o primeiro a ficar confuso após o encontro
-e
. No seu exemplosed 's/foo/bar/'
esed -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-e
usado. O motivo disso é que-e
possibilita o uso de mais de um script com a mesma invocação desed
. 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
sed
interpreta o primeiros/foo/bar
como um nome de arquivo. Portanto, para facilitar a vida do futuro, você já pode começar a usar a-e
bandeira 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-61fonte