Perforce触发器sed语法报错:未终止`s`命令问题求助
解决Perforce触发器里sed命令报错的问题
为啥会出这问题
你碰到的unterminated 's' command错误,本质是sed的替换命令没被正确解析,主要原因有这几个:
- Perforce触发器的命令会被系统shell再解析一遍,引号、换行符的转义和直接在终端敲命令不一样
- 原命令里的换行符
\n没转义对,导致shell直接把sed表达式拆成了几段 - 引号嵌套乱了,sed的
s命令没被完整识别,就报“未终止”了
几个能解决的办法
办法1:换sed分隔符+转义换行符
把sed替换用的分隔符从/换成|(不容易和内容冲突),同时把换行符\n转成\\n(因为Perforce会先解析一次转义,shell还要再解析一次),然后用单引号把sed的完整表达式包起来,外层用双引号裹住整个命令:
Triggers: patchnotes01 form-out change "sed -i 's|<.*>|<Internal Notes>:\\n\\n<**External Notes**>: |' %formfile%"
办法2:用here-doc写sed脚本(更稳)
如果替换逻辑复杂,直接用here-doc写sed脚本,省得跟转义较劲:
Triggers: patchnotes01 form-out change "cat << 'EOF' | sed -i -f - %formfile% s|<.*>|<Internal Notes>: <**External Notes**>: | EOF"
这里'EOF'带单引号,能保证脚本里的内容不会被shell乱解析,换行直接敲就行,不用加转义符。
办法3:先在终端测命令
先在本地终端模拟测试sed命令,确认没问题再往触发器里加,比如:
echo "<test>" | sed 's|<.*>|<Internal Notes>:\n\n<**External Notes**>: |'
看输出是不是你要的格式,再调整引号和转义。
要注意的点
- Perforce触发器用的是系统默认shell(一般是bash),所有特殊字符(换行、引号、反斜杠)都得考虑双重转义
- sed的替换分隔符尽量选替换文本里没有的字符,比如
|、#,省得额外转义 - 单引号和双引号嵌套的时候,别搞混了,确保sed的整个表达式是一个完整的字符串
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

