以下の行の sed コマンドは何を実行しますか?

以下の行の sed コマンドは何を実行しますか?

スクリプトファイルを分析していたら、以下の行に遭遇しました。

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

このコマンドが何をするのか、まだわかりません。-iインライン操作であることはわかっています。しかし、それが何をするのかはまだわかりません。この行を理解するのを手伝ってください。

答え1

sed -i  

-iファイルをその場で編集する、つまり同じ名前の上に新しいバージョンを書き込むことを意味します

/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

/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

これは、例えば次の例とほぼ同じです。ここ

答え2

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 

ただし、これは OS X にある BSD sed を使用している場合に限ります。GNU sed には適用されません。

関連情報