You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:50:41