No puedo encontrar ninguna documentación sobre el sed -einterruptor, para un reemplazo simple, ¿la necesito?
p.ej
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
No puedo encontrar ninguna documentación sobre el sed -einterruptor, para un reemplazo simple, ¿la necesito?
p.ej
sed 's/foo/bar/'
VS
sed -e 's/foo/bar/'
Respuestas:
Desde la página del manual:
-e script, --expression=script
add the script to the commands to be executed
Por lo tanto, puede usar varias -eopciones para crear un script a partir de muchas partes.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Primero reemplazaría foocon bary luego eliminaría cada línea que contenga FOO.
-e
Esto podría funcionar para usted:
sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file
En cada caso, los comandos i(insertar), a(agregar) y c(cambiar) deben terminarse con una nueva línea.
Normalmente, los comandos pueden separarse por un ;eg /foo/d;/bar/dy agruparse por {...} eg, /foo/{h;d}pero para los i,a,ccomandos -eproporciona una forma de separar los comandos.
La alternativa es usar el shell (bash) para insertar una nueva línea:
sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file
-e, en lugar de con punto y coma. Esto no funcionará: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Pero esto:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
must be terminated with a newlinefrase aquí. Cuando probé aquí en mi cygwin, esto funciona: sed '/foo/i\bar' file. Entonces, ahora que podemos fusionar las expresiones separadas en una sola, esto plantea nuevamente la pregunta original: ¿Cuál es el verdadero propósito de la -e?
En la ayuda para sedusted encontrará que la -ebandera significa:
-e script, --expression=script
add the script to the commands to be executed
Pero no eres el primero en confundirte después de encontrarte -e. En tu ejemplo sed 's/foo/bar/'y sed -e 's/foo/bar/'son equivalentes. En ambos casos s/foo/bar/es el script ejecutado por sed. La segunda opción es más explícita, pero probablemente esa no sea la razón por la que a menudo se la -eusa. El motivo es que -epermite utilizar más de un script con la misma invocación de sed. Eso todavía deja la pregunta ¿por qué usarlo si está usando solo un script? El siguiente ejemplo podría explicar eso:
echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'
Saldrá "foo".
Sin embargo,
echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'
fallará porque ahora sedinterpreta el primero s/foo/barcomo un nombre de archivo. Por lo tanto, para facilitarle la vida en el futuro, ya puede comenzar a usar la -ebandera hoy. De esa manera, en el futuro, puede agregar el comando con un script adicional utilizando -e <script>.
Nota: en otras respuestas ;se ha sugerido el uso como alternativa para usar varios scripts. Si bien eso es técnicamente posible en algunos casos, no se recomienda, ya que rápidamente conduce a un código muy difícil de leer. Vea un ejemplo aquí: https://www.grymoire.com/Unix/Sed.html#uh-61
man sed?