¿Cuál es el propósito de -e en el comando sed?


41

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/'

14
¿Estás seguro de que no encontraste esto en man sed?

44
No encuentra una explicación potencial, por qué no usar "cmd1; cmd2"
usuario desconocido

Respuestas:


28

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.


3
Entonces, no necesitas '-e' si solo tienes un script, ¿verdad?
JohnyTex

Yo también estoy buscando el verdadero propósito de-e
typelogic

27

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

1
Al menos en algunas implementaciones de sed (por ejemplo, en FreeBSD), también debe finalizar las etiquetas y los comandos de ramificación utilizando nuevas líneas / -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"
dubiousjim

No estoy seguro de cuán necesaria es la 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?
typelogic

1

-e, equivalente a --expression, es opcional, a menos que esté encadenando varias expresiones juntas (no común) como se muestra en otra Respuesta .

Aparte: ;se puede usar en su lugar en la misma expresión para ejecutar varias expresiones una tras otra.


0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.