Was macht der sed-Befehl in der folgenden Zeile?

Was macht der sed-Befehl in der folgenden Zeile?

Ich habe die Skriptdatei analysiert und bin auf die folgende Zeile gestoßen

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

Ich kann immer noch nicht herausfinden, was dieser Befehl macht. Ich weiß, -idass es sich um eine Inline-Operation handelt. Aber was er macht, ist mir immer noch unbekannt. Bitte helfen Sie mir, diese Zeile zu verstehen.

Antwort1

sed -i  

-isagt, die Datei direkt zu bearbeiten, d.h. die neue Version über den gleichen Namen zu schreiben

/JBOSS_HOME\/bin\/run.sh/

Ein durch Schrägstriche getrenntes Muster. Die im Muster enthaltenen Schrägstriche werden mit Backslashes in Anführungszeichen gesetzt, sodass dies auf jede Zeile zutrifft, die enthält JBOSS_HOME/bin/run.sh. (Da es sich um einen regulären Ausdruck handelt, entspricht der Punkt tatsächlich jedem Zeichen.)

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

Der Befehl, der ausgeführt werden soll, wenn das Muster übereinstimmt, idient zum Einfügen einer Zeile (vor der aktuellen). Die hinzuzufügende Zeile wird durch den Backslash getrennt, daher wird die Zeichenfolge hinzugefügt export TMP_FOLDER=$JBOSS_HOME/server/default/tmp.

/home/jboss/runJBOSSEAP.sh

Zieldateiname.

z.B

$ 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 ist so ziemlich das gleiche wie zB das BeispielHier

Antwort2

Die Antwort von ilkkachus ist großartig und ausführlich, dafür gibt es ein Upvote. Hier ist nur eine Randbemerkung, falls Sie BSD sed (wie in OS X) verwenden. Dies:

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

Funktioniert nicht. Damit es mit BSD sed funktioniert, müssen Sie zuerst die -iOption wie folgt korrigieren: sed -i."". Außerdem müssen Sie Ihren Einschub in einer separaten Zeile platzieren, wie folgt:

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

Aber noch einmal: Dies gilt nur, wenn Sie BSD sed verwenden, wie es unter OS X zu finden ist. Gilt nicht für GNU sed.

verwandte Informationen