正则表达式替换Jenkinsfile(声明性)中的模式中带有“&”的模式

时间:2019-02-19 16:26:20

标签: regex bash sed

我有一个Ansible库存文件,该文件的ansible_password值需要由用户输入替换

我在windows.yaml下方的内容

ansible_user=sa_user@somewindowsdomain.external
ansible_password =

然后我从詹金斯(Jenkins)获得一个userInput,用户在其中输入&32lihdye34jC5W

parameters {
            password defaultValue: '', description: 'Please Enter ansible_password ', name: 'sa_pass'
                      }

sh 'echo ${sa_pass}'

我在下面尝试过

sed -i "s/ansible_password=.*/ansible_password=${sa_pass}/g" $inventory_path/windows.yaml

它不满足我的要求,但却跌倒了

ansible_password=ansible_password32lihdye34jC5W

我期望的是

ansible_password = &32lihdye34jC5W

1 个答案:

答案 0 :(得分:0)

一种方法是避免使用s///。如果您使用的是GNU sed,则可以执行以下操作:

$: a_pass="&32lihdye34jC5W"; echo "foo stuff
ansible_password=ansible_password32lihdye34jC5W
bar stuff" | sed -E "/ansible_password\s*=\s*/ {
                    e echo \"ansible_password = ${sa_pass}\";
                    d; }"
foo stuff
ansible_password = &32lihdye34jC5W
bar stuff

GNU sed的{​​{1}}被“执行”并运行一个子命令。
需要e来阻止d打印sed命令之外的记录。

另一种方法是在POSIX chracter类中用引号引起来。

e

认为应该适用于非GNU版本。