如何使用 shell 脚本将变量中的字符串替换为文件中的另一个字符串

How to replace a string in a variable with another string in a file using shell script

我想在 shell 执行 jenkins 中用另一个字符串替换一个字符串。

这个有效:

sed -i 's/\/opt\/Project\/workspace\/'${PRODUCT}'\/common\/ci_build_Type-'${SUB_PRODUCT}'/\/home\/Projects\/XXX\/'${PRODUCT}'\/common\/ci_build_polyspace_Type-'${SUB_PRODUCT}'/g' polyspaceFiles_${SUB_PRODUCT}_tmp.opts;

但我想要这样

#!/bin/sh

WORKSPACE="/opt/Project/jenkins/XX/XX/XX/XX/XXX-XXX"
echo $WORKSPACE
PRODUCT="MyProject"
SUB_PRODUCT="MySubProject"
sed -i 's/'$WORKSPACE'/\/home\/Projects\/XXX\/'$PRODUCT'\/common\/XXX-'$SUB_PRODUCT'/g' polyspaceFiles_$SUB_PRODUCT_tmp.opts;

但是没用。

我该怎么做?

谢谢

您可以使用 / 以外的字符作为 seds 替换命令的分隔符。
这样您就不必转义所有字符在您的路径中使用斜杠以避免语法损坏。

例如您可以使用 ~,如下所示,如果您确定它不会出现在任何路径变量中。
(您也可以使用 #%*+| 等作为替换定界符。任何适合您的需要。只要确保 s 命令中使用的所有三个定界符都相同.)

sed -i 's~'"$WORKSPACE"'~/home/Projects/XXX/'"$PASE_PRODUCT"'/common/XXX-'"$SUB_PRODUCT"'~g' "polyspaceFiles_$PASE_SUB_PRODUCT_tmp.opts";

sed 的默认分隔符与 WORKPLACE 中存在的相同字符冲突。如评论中所述,将定界符更改为任何输入中都不存在的字符或转义斜杠可以解决该问题。

但是,您还有一个单引号问题。不仅会报错,变量也不会展开

这个sed应该可以工作

$ sed -i.bak s"|$WORKSPACE|/home/Projects/XXX/$PASE_PRODUCT/common/XXX-$SUB_PRODUCT|" polyspaceFiles_"$PASE_SUB_PRODUCT"_tmp.opts