Jenkins管道因sed命令而失败

时间:2018-05-10 04:31:13

标签: jenkins groovy sed

我正在管道中运行sed命令,但它失败并出现错误

sed: file - line 2: unterminated `s' command

这是我在管道中的sed代码:

sh '''sed '/^[[:blank:]]*$/d;s|^|s/%%|;s|:|%%/|;s|$|/|' key.txt | sed -f - file1.txt > file2.txt'''

如果我只运行第一个sed命令,Jenkins会给出非常奇怪的输出,这里是来自Jenkins的日志,它添加了带字符的额外行:

+ sed '/^[[:blank:]]*$/d;s|^|s@%%|;s|:|%%@|;s|$|@|' keys.txt
s@%%sql_server_name%%@test_seqserver_1234
@
s@%%
@
s@%%sql_login_name%%@test_login_name
@
s@%%
@
s@%%password%%@test_password 
@
s@%%
@

如果运行以下命令,这就是Jenkins输出的样子

sh '''sed '/^[[:blank:]]*$/d;/:/!d;s|^|s/%%|;s|:|%%/|;s|$|/|' 
keys.txt'''

詹金斯输出:

+ sed '/^[[:blank:]]*$/d;/:/!d;s|^|s/%%|;s|:|%%/|;s|$|/|' keys.txt
s/%%sql_server_name%%/test_seqserver_1234
/
s/%%sql_login_name%%/test_login_name
/
s/%%password%%/test_password 
/
s/%%SID%%/123456 
/

我运行了新命令:

sh '''sed -e '/:/!d;s|^\\([^:]*\\):\\(.*\\)$|s/%%\\1%%/\\2/|' -e 'N;s|\\n/|/|' keys.txt'''

这是输出:

Running shell script
+ sed -e '/:/!d;s|^\([^:]*\):\(.*\)$|s/%%\1%%/\2/|' -e 'N;s|\n/|/|' 
keys.txt
s/%%sql_server_name%%/test_seqserver_1234
/

s/%%sql_login_name%%/test_login_name
/

s/%%password%%/test_password 
/

s/%%SID%%/123456 

这是文本文件的xxd输出:

Running shell script
+ xxd keys.txt
0000000: 7371 6c5f 7365 7276 6572 5f6e 616d 653a  sql_server_name:
0000010: 7465 7374 5f73 6571 7365 7276 6572 5f31  test_seqserver_1
0000020: 3233 340d 0a0d 0a73 716c 5f6c 6f67 696e  234....sql_login
0000030: 5f6e 616d 653a 7465 7374 5f6c 6f67 696e  _name:test_login
0000040: 5f6e 616d 650d 0a0d 0a70 6173 7377 6f72  _name....passwor
0000050: 643a 7465 7374 5f70 6173 7377 6f72 6420  d:test_password 
0000060: 0d0a 0d0a 5349 443a 3132 3334 3536 200d  ....SID:123456 .
0000070: 0a0d 0a64 6566 6175 6c74 5f64 6174 6162  ...default_datab
0000080: 6173 653a 7465 6d70 6462 0d0a 0d0a 6465  ase:tempdb....de
0000090: 6661 756c 745f 6c61 6e67 7561 6765 3a75  fault_language:u
00000a0: 735f 656e 676c 6973 680d 0a0d 0a63 6865  s_english....che
00000b0: 636b 5f65 7870 6972 6174 696f 6e3a 4f46  ck_expiration:OF
00000c0: 460d 0a0d 0a63 6865 636b 5f70 6f6c 6963  F....check_polic
00000d0: 793a 4f46 460d 0a0d 0a64 656c 6976 6572  y:OFF....deliver
00000e0: 7974 7970 653a 7363 6865 6475 6c65 640d  ytype:scheduled.
00000f0: 0a0d 0a73 6368 6564 756c 6564 5f64 656c  ...scheduled_del
0000100: 6976 6572 7964 6174 653a 3035 2d33 302d  iverydate:05-30-
0000110: 3230 3939 0d0a 0d0a 7363 6865 6475 6c65  2099....schedule
0000120: 645f 6465 6c69 7665 7279 5f32 3468 725f  d_delivery_24hr_
0000130: 6365 6e74 7261 6c5f 7469 6d65 3a31 3135  central_time:115
0000140: 3920 0d0a 0d0a 0d0a 0d0a 0d0a 0d0a 0d0a  9 ..............    

1 个答案:

答案 0 :(得分:1)

看起来你的key.txt文件的值不正确。从第一个sed命令判断:

sed '/^[[:blank:]]*$/d; s|^|s/%%|; s|:|%%/|; s|$|/|' key.txt

它希望每一行都包含一个分号。然后它为第二个sed命令形成sed代码:

sed -f - file1.txt > file2.txt

如果你的key.txt包含没有分号的非空行,你将收到错误unterminated 's' command

确保key.txt正确无误,或者至少将/:/!d;添加到您的管道中。像这样:

sh '''sed '/^[[:blank:]]*$/d;/:/!d;s|^|s/%%|;s|:|%%/|;s|$|/|' key.txt | sed -f - file1.txt > file2.txt'''

例如,更正key.txt内容:

username:server1

key.txt:

错误
username server2

此行中没有分号,因此会导致错误。

您可能会尝试用更简单的命令替换第一个sed命令:

sed '/:/!d;s|^\([^:]*\):\(.*\)$|s/%%\1%%/\2/|' key.txt

或更好:

sed -e '/:/!d;s|^\([^:]*\):\(.*\)$|s/%%\1%%/\2/|' -e 'N;s|\n/|/|' key.txt

如果这样做无效,请运行xxd key.txthexdump -C key.txt并发布输出。

在您添加了key.txt文件的十六进制内容后,我终于可以在我的机器上复制该问题了。这个命令可以解决这个问题:

sed -e '/:/!d;s|^\([^:]*\):\(.*\)\r|s/%%\1%%/\2/|' key.txt

所以诀窍是在第一个sed命令中使用\r而不是$。如果它仍然不适合你(可能,如果你使用MacOS),你可以使用你选择的工具(如dos2unix)从key.txt文件中remove carriage return,然后你的原始代码应该有效。