下面一行中的 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 的情況。

相關內容