我正在尝试在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 \{\}
我愿意在需要时发布更多代码,但对此表示感谢!
答案 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" """
就像我说的那样,虽然不漂亮,但是可以用:)感谢您的帮助!