Что делает команда sed в строке ниже?

Я анализировал файл сценария, и я наткнулся на строку ниже

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

Я до сих пор не могу понять, что делает эта команда. Я знаю -i означает, что это встроенная операция. Но то, что он делает, до сих пор неизвестно мне. Пожалуйста, помогите мне понять эту строку.

 sed -i 

-i говорит, чтобы редактировать файл на месте, то есть написать новую версию с тем же именем

 /JBOSS_HOME\/bin\/run.sh/ 

Образец, разделенный косой чертой, слэши, содержащиеся в шаблоне, цитируются JBOSS_HOME/bin/run.sh косыми чертами, поэтому это соответствует любой строке, содержащей JBOSS_HOME/bin/run.sh (На самом деле, поскольку это регулярное выражение, точка соответствует любому символу.)

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

Команда для запуска, когда шаблон совпадает, i предназначен для вставки строки (до текущего). Строка, которую нужно добавить, разделяется export TMP_FOLDER=$JBOSS_HOME/server/default/tmp , поэтому это добавляет строку export TMP_FOLDER=$JBOSS_HOME/server/default/tmp .

 /home/jboss/runJBOSSEAP.sh 

Название целевого файла.

например

 $ 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 

Это почти то же самое, что, например, пример здесь

Ответ ilkkachu великий и обширный, отдаленный дан. Вот лишь побочная заметка, если вы используете BSD sed (как в OS X). Эта:

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

Не работает. Чтобы он работал с BSD sed, вам сначала нужно исправить параметр -i следующим образом: sed -i."" . Кроме того, вам нужно иметь свою вставку в отдельной строке, например:

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

Но опять же, это просто, если вы используете BSD sed, как показано в OS X. Не применяется к GNU sed.