![下面一行中的 sed 命令有什么作用?](https://linux22.com/image/95261/%E4%B8%8B%E9%9D%A2%E4%B8%80%E8%A1%8C%E4%B8%AD%E7%9A%84%20sed%20%E5%91%BD%E4%BB%A4%E6%9C%89%E4%BB%80%E4%B9%88%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
我正在分析脚本文件,发现了下面的行
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。