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



我想在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;

但是行不通。

我该怎么做?

感谢

sed的默认分隔符与WORKPLACE中存在的相同字符冲突。正如在注释中提到的,将分隔符更改为任何输入中不存在的字符或转义斜杠将解决该问题。

然而,你也有一个单引号问题。你不仅会得到一个错误,变量也不会展开。

这个sed应该工作

$ sed -i.bak s"|$WORKSPACE|/home/Projects/XXX/$PASE_PRODUCT/common/XXX-$SUB_PRODUCT|" polyspaceFiles_"$PASE_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";

最新更新