O que o comando sed na linha abaixo faz?

O que o comando sed na linha abaixo faz?

Eu estava analisando o arquivo de script e me deparei com a linha abaixo

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

Ainda não consigo descobrir o que esse comando faz. Eu sei -ique significa que é uma operação inline. Mas o que isso faz ainda é desconhecido para mim. Por favor me ajude a entender esta linha.

Responder1

sed -i  

-idiz para editar o arquivo no local, ou seja, escrever a nova versão com o mesmo nome

/JBOSS_HOME\/bin\/run.sh/

Um padrão, separado por barras, as barras contidas no padrão são citadas com barras invertidas, portanto, corresponde a qualquer linha que contenha JBOSS_HOME/bin/run.sh. (Na verdade, como é uma regex, o ponto corresponde a qualquer caractere.)

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

Comando a ser executado quando o padrão corresponder, iserve para inserir uma linha (antes da atual). A linha a ser adicionada é separada pela barra invertida, então isso adiciona a string export TMP_FOLDER=$JBOSS_HOME/server/default/tmp.

/home/jboss/runJBOSSEAP.sh

Nome do arquivo de destino.

por exemplo

$ 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

É praticamente o mesmo que, por exemplo, o exemploaqui

Responder2

A resposta de ilkkachu é ótima e extensa, com voto positivo dado. Aqui está apenas uma observação se você estiver usando o BSD sed (como no OS X). Esse:

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

Não funciona. Para que funcione com BSD sed você primeiro precisa corrigir a -iopção assim: sed -i."". Além disso, você precisa colocar sua inserção em uma linha separada, assim:

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

Mas, novamente, isso é apenas se você estiver usando o BSD sed conforme encontrado no OS X. Não se aplica ao GNU sed.

informação relacionada