No puedo encontrar ninguna documentación sobre el sed
-e
interruptor, 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
-e
interruptor, 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 -e
opciones para crear un script a partir de muchas partes.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Primero reemplazaría foo
con bar
y 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/d
y agruparse por {...
} eg, /foo/{h;d}
pero para los i,a,c
comandos -e
proporciona 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 newline
frase 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 sed
usted encontrará que la -e
bandera 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 -e
usa. El motivo es que -e
permite 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 sed
interpreta el primero s/foo/bar
como un nombre de archivo. Por lo tanto, para facilitarle la vida en el futuro, ya puede comenzar a usar la -e
bandera 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
?