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
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.
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
?Respuestas:
Desde la página del manual:
Por lo tanto, puede usar varias
-e
opciones para crear un script a partir de muchas partes.Primero reemplazaría
foo
conbar
y luego eliminaría cada línea que contengaFOO
.fuente
-e
Esto podría funcionar para usted:
En cada caso, los comandos
i
(insertar),a
(agregar) yc
(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 losi,a,c
comandos-e
proporciona una forma de separar los comandos.La alternativa es usar el shell (bash) para insertar una nueva línea:
fuente
-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 micygwin
, 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
?-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.fuente
En la ayuda para
sed
usted encontrará que la-e
bandera significa:Pero no eres el primero en confundirte después de encontrarte
-e
. En tu ejemplosed 's/foo/bar/'
ysed -e 's/foo/bar/'
son equivalentes. En ambos casoss/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 desed
. 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 primeros/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-61fuente