Não consigo encontrar nenhuma documentação sobre o sed
-e
comutador; para uma substituição simples, preciso?
por exemplo
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Não consigo encontrar nenhuma documentação sobre o sed
-e
comutador; para uma substituição simples, preciso?
por exemplo
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Respostas:
Na página do manual:
-e script, --expression=script
add the script to the commands to be executed
Portanto, você pode usar várias -e
opções para criar um script de várias partes.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Em primeiro lugar substituir foo
com bar
e exclua todas as linhas contendo FOO
.
-e
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/d
e agrupados por {...
}, por exemplo, /foo/{h;d}
mas para os i,a,c
comandos, -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
-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 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
?
Na ajuda, sed
você encontrará que -e
flag 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 -e
usado. O motivo disso é que -e
possibilita 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 sed
interpreta o primeiro s/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-61
man sed
?