¿Qué hace el comando sed en la línea siguiente?

¿Qué hace el comando sed en la línea siguiente?

Estaba analizando el archivo de script y encontré la siguiente línea

sed -i '/JBOSS_HOME\/bin\/run.sh/i \export TMP_FOLDER=$JBOSS_HOME/server/default/tmp ' /home/jboss/runJBOSSEAP.sh

Todavía no puedo entender qué hace este comando. Lo sé -isignifica que es una operación en línea. Pero aún no conozco lo que hace. Por favor ayúdame a entender esta línea.

Respuesta1

sed -i  

-idice editar el archivo en el lugar, es decir, escribir la nueva versión con el mismo nombre

/JBOSS_HOME\/bin\/run.sh/

Un patrón, separado por barras, las barras contenidas en el patrón están entrecomilladas con barras invertidas, por lo que coincide con cualquier línea que contenga JBOSS_HOME/bin/run.sh. (En realidad, como es una expresión regular, el punto coincide con cualquier carácter).

i \export TMP_FOLDER=$JBOSS_HOME/server/default/tmp '

El comando a ejecutar cuando el patrón coincide, ies para insertar una línea (antes de la actual). La línea que se agregará está separada por una barra invertida, por lo que esto agrega la cadena export TMP_FOLDER=$JBOSS_HOME/server/default/tmp.

/home/jboss/runJBOSSEAP.sh

Nombre del archivo de destino.

p.ej

$ echo JBOSS_HOME/bin/run.sh > pla 
$ sed -i '/JBOSS_HOME\/bin\/run.sh/i \export TMP_FOLDER=$JBOSS_HOME/server/default/tmp ' pla
$ cat pla
export TMP_FOLDER=$JBOSS_HOME/server/default/tmp 
JBOSS_HOME/bin/run.sh

Es más o menos lo mismo que, por ejemplo, el ejemplo.aquí

Respuesta2

La respuesta de ilkkachu es excelente y extensa, se ha votado a favor. Aquí hay solo una nota al margen si está utilizando BSD sed (como en OS X). Este:

sed -i '/JBOSS_HOME\/bin\/run.sh/i \export TMP_FOLDER=$JBOSS_HOME/server/default/tmp ' foo 
sed: 1: "foo": invalid command code f

No funciona. Para que funcione con BSD sed, primero debes arreglar la -iopción como esta: sed -i."". Además, debe tener su inserción en una línea separada, como esta:

sed -i."" '/JBOSS_HOME\/bin\/run.sh/i \
export TMP_FOLDER=$JBOSS_HOME/server/default/tmp ' foo 

Pero, nuevamente, esto es solo si está utilizando BSD sed como se encuentra en OS X. No se aplica a GNU sed.

información relacionada