Jenkinsfile中的sed命令转义错误

时间:2019-08-21 22:02:36

标签: bash groovy sed jenkins-pipeline

我正在尝试在jenkins文件中运行sed命令,该文件的搜索模式中包含许多特殊字符,替换字符串正在使用两个变量和一个字符串。

我要替换的字符串是: ${data.terraform_remote_state.bucket.s3_bucket_name2}

我需要用一个简单的字符串替换所有字符串,但是用方括号抓住完整的字符串非常困难。

这是我尝试过的最新方法,以及其他一些尝试,以减少转义或试图将完整的字符串放入sed命令中。

sh """
    S3_IAM_PATH1='\$\\{data\\.terraform_remote_state\\.bucket\\.s3_bucket_name1\\}'
    S3_IAM_PATH2='\$\\{data\\.terraform_remote_state\\.bucket\\.s3_bucket_name2\\}'
    sed -i s/\${S3_IAM_PATH1}/\${CLUSTER_NAME}-\${ID}-export/g $CLUSTER_TYPE/security/iam.tf
    sed -i s/\${S3_IAM_PATH2}/\${CLUSTER_NAME}-\${ID}-import/g $CLUSTER_TYPE/security/iam.tf
    cat $CLUSTER_TYPE/security/iam.tf
"""

我得到的当前输出是这样:

+ S3_IAM_PATH1='$\{data\.terraform_remote_state\.bucket\.s3_bucket_name1\}'
+ S3_IAM_PATH2='$\{data\.terraform_remote_state\.bucket\.s3_bucket_name2\}'
+ sed -i 's/$\{data\.terraform_remote_state\.bucket\.s3_bucket_name1\}/thisCluster1-process211-export/g' DATA-CLUSTER/security/awsiam.tf
sed: -e expression #1, char 93: Invalid content of \{\}

我愿意在需要时发布更多代码,但对此表示感谢!

2 个答案:

答案 0 :(得分:0)

您应使用三重单引号''',它不会触发Jenkinsfile中出现的模式${}上的groovy string interpolation

// previous stage
def CLUSTER_TYPE = 'xxx'

// if CLUSTER_TYPE is groovy variable in previous stage
// you can make it into environment variable, so that
// bash in next stage can access it from environment variables
env.CLUSTER_TYPE = CLUSTER_TYPE 


// next stage
sh '''
    S3_IAM_PATH1='${data.terraform_remote_state.bucket.s3_bucket_name1}'
    S3_IAM_PATH2='${data.terraform_remote_state.bucket.s3_bucket_name2}'
    sed -i "s/${S3_IAM_PATH1}/${CLUSTER_NAME}-${ID}-export/g" "$CLUSTER_TYPE/security/iam.tf"
    sed -i "s/${S3_IAM_PATH2}/${CLUSTER_NAME}-${ID}-import/g" "$CLUSTER_TYPE/security/iam.tf"
    cat "$CLUSTER_TYPE/security/iam.tf"
'''

答案 1 :(得分:0)

我最终通过@yong提供的第一个问题使它运行,并做了一些小调整,以防将来有人需要类似的东西。问题是CLUSTER_TYPE变量未在jenkinsfile中设置为Parameter,而是在上一阶段中创建的。要访问它,我需要使用双引号。因此,某些解决方案需要双引号,而其他解决方案则需要单引号:

sh '''
    S3_IAM_PATH1='${data.terraform_remote_state.bucket.s3_bucket_name1}'
    S3_IAM_PATH2='${data.terraform_remote_state.bucket.s3_bucket_name2}'
    sed -i "s/${S3_IAM_PATH1}/${CLUSTER_NAME}-${ID}-export/g" ''' + 
 "$CLUSTER_TYPE/security/iam.tf; " +
    '''sed -i "s/${S3_IAM_PATH2}/${CLUSTER_NAME}-${ID}-import/g" ''' 
 + """$CLUSTER_TYPE/security/iam.tf; 
    cat "$CLUSTER_TYPE/security/iam.tf" """

就像我说的那样,虽然不漂亮,但是可以用:)感谢您的帮助!