Jenkins中sed命令因变量换行导致未终止`s`命令的修复方案
修复Jenkins中sed替换变量时的换行截断问题
问题原因
cert.json的内容包含换行符、斜杠等特殊字符,直接将$cert拼接到sed命令中时,这些字符会破坏sed命令的语法结构,导致替换命令被换行截断,触发unterminated 's' command错误。
修复方案
方案1:转义特殊字符并消除换行
先对证书内容做预处理,转义sed的分隔符斜杠,同时把所有换行替换为空格,避免拆分命令:
cert = sh(returnStdout: true, script: "cat cert.json | sed -e 's/\\//\\\\\\//g' -e ':a' -e 'N' -e '$!ba' -e 's/\\n/ /g'") sh "sed -i '0,/content:.*/s//content: $cert/g' example.yaml"
- 第一行的sed命令做了两件事:
s/\\//\\\\\\//g:将所有斜杠/转义为\/,避免干扰sed的替换分隔符:a;N;$!ba;s/\\n/ /g:将文件中的所有换行符替换为空格,确保cert内容是单行
方案2:用awk安全传递变量
改用awk工具,通过-v参数传递变量,避免直接拼接命令带来的语法问题:
// 先转义cert中的斜杠,适配awk语法 escaped_cert = cert.replaceAll(/\//, "\\/") sh """ awk -v cert="${escaped_cert}" 'NR==1,/content:.*/ {sub(/content:.*/,"content: " cert)} 1' example.yaml > temp.yaml && mv temp.yaml example.yaml """
- awk通过
-v接收变量,不会被换行符或特殊字符打断,处理完成后覆盖原文件
方案3:base64编码中转
通过base64编码避免特殊字符的影响,在sed命令中再解码还原:
cert_b64 = sh(returnStdout: true, script: "cat cert.json | base64 -w0") sh "sed -i '0,/content:.*/s//content: $(echo ${cert_b64} | base64 -d)/g' example.yaml"
- 用
base64 -w0生成无换行的编码字符串,解码时还原原始内容,全程不会出现拆分命令的换行
内容的提问来源于stack exchange,提问作者Omar Kalloush
相关产品推荐
相关产品推荐

