代码之家  ›  专栏  ›  技术社区  ›  dino110

sed命令的Jenkins管道失败

  •  2
  • dino110  · 技术社区  · 6 年前

    我正在管道中运行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'''
    

    Jenkins输出:

    + 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 回复  |  直到 6 年前
        1
  •  1
  •   Andriy Makukha    6 年前

    看起来像你的钥匙。txt文件的值不正确。从第一个sed命令来看:

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

    它要求每行包含分号。然后为第二个sed命令形成sed代码:

    sed -f - file1.txt > file2.txt
    

    如果你的钥匙。txt包含不带分号的非空行,您将得到错误 unterminated 's' command

    确保钥匙。txt正确,或至少添加 /:/!d; 进入你的管道。像这样:

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

    例如,正确的键。txt内容:

    username:server1
    

    钥匙不正确。txt文件:

    username server2
    

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


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

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

    或更好:

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

    如果没有帮助,就跑吧 xxd key.txt hexdump -C key.txt 并发布输出。


    添加密钥的十六进制内容后。txt文件,我终于可以在我的机器上复制该问题。此命令可解决此问题:

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

    所以诀窍是 \r 而不是 $ 在第一个sed命令中。如果它仍然不适合您(如果您使用MacOS,可能会这样),您可以 remove carriage return 从钥匙。txt文件和您选择的工具(如 dos2unix )然后您的原始代码就可以工作了。