groovy + shell : экранирование символов

Я использую Jenkins Pipeline с песочницей Groovy. И я пытаюсь запустить сценарий оболочки в функции groovy sh.

Оригинальный сценарий оболочки

sed -i 's/sometext/'"${othertext}"'/' filename

Я пытаюсь заменить определенный текст другим текстом (взятым динамически). Скрипт отлично работает при прямом выполнении. Но я хочу использовать его в функции jenkins groovy sh.

sh(script: '<above shell script>',  returnStdout:false)

Но есть проблема с экранированием символов. Я пробовал этот способ экранирования персонажа

sh (script: '''sed -i 's/sometext/othertext/' filename''', returnStdout:false)

Он отлично работает, но othertext не берется динамически. Может ли кто-нибудь помочь мне в экранировании символов с помощью оригинального сценария? Или, пожалуйста, предложите любой другой способ сделать это.


person Siddarth    schedule 06.09.2018    source источник
comment
Вы просматривали gist.github.com/Faheetah/e11bd0315c34ed32e681616e41279ef4? Это может помочь понять некоторые причуды побега.   -  person mkobit    schedule 06.09.2018


Ответы (2)


С входными данными от daggett и mkobit и я провел несколько экспериментов, следующий скрипт работал хорошо

def l_othertext = sh(script: 'echo ${othertext}', returnStdout: true).trim()
print('l_othertext='+l_othertext)
sh "sed -i 's/sometext/'${l_othertext}'/' filename"
person Siddarth    schedule 07.09.2018

если othertext - переменная groovy, то это должно работать:

def othertext = 'newtext'
sh (script: """sed -i 's/sometext/${othertext}/' filename""", returnStdout:false)
person daggett    schedule 06.09.2018
comment
othertext не является переменной groovy. Это параметр задания конвейера jenkins. другой текст является динамическим. - person Siddarth; 06.09.2018