Jenkins Pipeline中sed命令执行失败问题求助
解决Jenkins Pipeline中sed命令
unterminated 's' command错误 从你提供的日志和xxd输出来看,问题的根源很明确:你的keys.txt文件使用了Windows风格的CRLF换行符(\r\n,对应十六进制的0d0a),而Jenkins的Shell环境是类Unix环境,sed会把行尾的\r(回车符)当成每行内容的一部分,导致生成的sed替换命令格式错误。
具体原因分析
从xxd输出可以看到,每行末尾都是0d0a,比如第一行sql_server_name:test_seqserver_1234的结尾是0d0a。当sed处理这行时,\r会被保留在内容里,所以原本应该生成的正确替换命令是:
s/%%sql_server_name%%/test_seqserver_1234/
但实际生成的是:
s/%%sql_server_name%%/test_seqserver_1234\r/
末尾的\r是不可见字符,sed会认为你的s命令没有正确终止,从而抛出unterminated 's' command错误。
解决方案
你只需要在处理keys.txt时,先去掉每行末尾的\r字符,再执行后续的sed转换逻辑即可。这里有两种可行的方法:
方法1:在sed命令中直接清除\r
修改你的Pipeline命令,在过滤空行之前先移除行尾的回车符:
sh '''sed 's/\r$//;/^[[:blank:]]*$/d;s|^|s/%%|;s|:|%%/|;s|$|/|' keys.txt | sed -f - file1.txt > file2.txt'''
方法2:先用dos2unix转换文件格式
如果你的Jenkins环境安装了dos2unix工具,可以先将keys.txt转换为Unix LF换行格式,再执行原命令:
sh '''dos2unix keys.txt && sed '/^[[:blank:]]*$/d;s|^|s/%%|;s|:|%%/|;s|$|/|' keys.txt | sed -f - file1.txt > file2.txt'''
验证方法
你可以先执行以下命令确认换行符是否被正确处理:
sh '''sed 's/\r$//' keys.txt | xxd'''
如果输出中每行末尾只有0a(LF),说明\r已经被成功移除,此时再执行原sed逻辑就不会报错了。
内容的提问来源于stack exchange,提问作者dino110
相关产品推荐
相关产品推荐

