O que o comando sed na linha abaixo faz?

0

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 que -i significa que é uma operação em linha. Mas o que isso ainda é desconhecido para mim. Por favor me ajude a entender esta linha.

    
por Nilesh 26.09.2016 / 13:09

2 respostas

6
sed -i  

-i diz 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 contendo 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 para executar quando o padrão corresponde, i é 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 exemplo aqui

    
por 26.09.2016 / 13:28
2

A resposta da ilkkachu é ótima e extensa, acima de tudo. Aqui está apenas uma nota secundária se você estiver usando o BSD sed (como no OS X). Isso:

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 ele funcione com o BSD sed, primeiro você precisa corrigir a opção -i da seguinte forma: sed -i."" . Além disso, você precisa ter 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 como encontrado no OS X. Não se aplica ao GNU sed.

    
por 26.09.2016 / 14:38

Tags