Неудачный трубопровод Jenkins для команды sed - PullRequest
0 голосов
/ 10 мая 2018

Я запускаю команду 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, Дженкинс выдаст очень странный вывод, вот он из журналов Дженкинса, в котором добавляются дополнительные строки с символами:

+ 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 голосов
/ 10 мая 2018

Похоже, ваш файл 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.txt или hexdump -C key.txt и опубликуйте вывод.


После того, как вы добавили шестнадцатеричное содержимое вашего файла key.txt, я наконец смог воспроизвести проблему на моем компьютере. Проблема может быть решена с помощью этой команды:

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

Таким образом, хитрость заключается в использовании \r вместо $ в первой команде sed. Если он все еще не работает для вас (возможно, если вы используете MacOS), вы можете просто удалить возврат каретки из файла key.txt с помощью выбранного вами инструмента (например, dos2unix) и тогда ваш оригинальный код должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...