Sed命令在詹金斯管道中不起作用

时间:2018-09-10 05:59:59

标签: jenkins sed jenkins-pipeline

我有一个文件'README.txt',其中包含以下行-

  

“版本”:“ 1.0.0-alpha-test.7”

使用Jenkins管道,我想用

替换此行
"version": "1.0.0-alpha-test.{BUILD_NUMBER}"

当我在linux集群上尝试以下sed命令时,它会起作用

sed -i -E "s#(\"version\"[ ]*:[ ]*\".+alpha-test\.)[0-9]+\"#\1${BUILD_NUMBER}#g" README.txt

同一命令在Jenkins管道上不起作用。

尝试以下查询,但不起作用-

sh """
sed -i -E "s|([\"]version[\"][ ]*:[ ]*[\"].+alpha-test\\.)[0-9]+\"|\1${BUILD_NUMBER}|g" README.txt
cat README.txt
"""
  

/home/jenkins/workspace/test/test-pipeline@tmp/durable-eb774fcf/script.sh:   3:   /home/jenkins/workspace/test/test-pipeline@tmp/durable-eb774fcf/script.sh:   语法错误:“)”意外

2 个答案:

答案 0 :(得分:0)

我不知道“ Jenkins管道”是什么,但是我看不出您发布的sed脚本以您描述的方式失败的任何原因,因此我怀疑您的问题出在代码的其他地方。也许与文件的开头和结尾处的sh """"""有关(我认为这与“ Jenkins管道”语法有关,因为对于Shell脚本没有意义)。

无论如何,让我们清理引号,转义和括号表达式,看看是否有帮助:

$ cat README.txt
"version": "1.0.0-alpha-test.7"

$ BUILD_NUMBER=321

$ sed -E 's|("version" *: *".+alpha-test\.)[0-9]+|\1{BUILD_NUMBER}|g' README.txt
"version": "1.0.0-alpha-test.{BUILD_NUMBER}"

$ sed -E 's|("version" *: *".+alpha-test\.)[0-9]+|\1'"$BUILD_NUMBER"'|g' README.txt
"version": "1.0.0-alpha-test.321"

我无法从您的问题中得知您是否要在输出中使用{BUILD_NUMBER}$BUILD_NUMBER,所以我同时显示了两者。

答案 1 :(得分:0)

最好使用perl命令...

script{

old_version = (sh (returnStdout: true, script:'''old_version=`cat version.cfg |grep VERSION=|cut -d "=" -f2`
echo $old_version''')).toString().trim()

sh """

     if [ "$old_version" != $new_version ]; then
        perl -pi -e "s,$old_version,$new_version,g" version.cfg
        ##-- git push operation --##
     fi  

"""

}