我想在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
sed
的s
替换命令可以使用/
以外的字符作为分隔符。
这样你就不必转义路径中的所有斜杠来避免语法破坏。
。您可以使用~
,如下所示,如果您确定它不会在任何路径变量中。
(您也可以使用#
,%
,*
,+
,|
等中的任何一个作为替换分隔符。只要你需要就行。只要确保s
命令中使用的所有三个分隔符是相同的。)
sed -i 's~'"$WORKSPACE"'~/home/Projects/XXX/'"$PASE_PRODUCT"'/common/XXX-'"$SUB_PRODUCT"'~g' "polyspaceFiles_$PASE_SUB_PRODUCT_tmp.opts";