Ansible替换模块Regex没有检测到正确的行

时间:2016-06-23 02:39:22

标签: regex ansible

我正在尝试在文本文件上使用替换模块来替换它找到的正则表达式匹配的任何实例(不包括它周围的's)。我基本上只是在文本文件中搜索整个字符串或数字(3306)或(myhostname)。

不幸的是,我在这里定义的正则表达式没有正确检测字符串。我在regextester上找到的例子似乎没有正常工作。

  tasks:
    - name: Rename the host database strings inside of each tenants settings.php file
      replace:
        dest: /var/www/html/someFile.txt 
        regexp: "/ec2-52-11-164-22.compute-1.amazonaws.com/g"
        replace: 127.0.0.1


    - name: Rename the port inside of each tenants settings.php file
      replace:
        dest: /var/www/html/someFile.txt 
        regexp: "/3306/g"
        replace: 4006

这是我正在搜索的文字 -

Server1
        'host' => 'ec2-52-11-164-22.compute-1.amazonaws.com',
        'port' => '3306',
Server2
        'host' => 'ec2-34-112-123-53.compute-1.amazonaws.com',

如果不使用's来选择那两个字符串,那么正确的正则表达式是什么?

1 个答案:

答案 0 :(得分:1)

您尝试将两个不同的字符串匹配到一个字符串。在正则表达式中,只有少数几个字符具有任何特殊含义;有关如何正则表达式的详细指南this is my favorite

无论如何,你要做的就是用正则表达式引擎与一组数字匹配的东西替换所有数字组,这意味着:

ec2(-\d+){4}

而不是:

ec2-52-11-164-22

现在,正则表达式意味着"匹配字符ec2,然后匹配子模式四次。该子模式匹配文字-字符,后跟至少一个数字"。我对Amazon AWS链接并不熟悉,但对于在不同主机之间进行更改的任何部分,您只需将其替换为通用的正则表达式。例如,如果开头的ec2也可以是eb5ed78,那么它将是e[a-z]\d+ - 字母e,后跟任何字符在az的ASCII码之间,后跟至少一位数。

至于端口,它只是\d{1,4} - 从1到4位数。除非你只想匹配那个特定的端口,当然,在这种情况下保留你拥有的东西。

如果你看起来很难,你可能也会找到一个预制的正则表达式,但我建议你自己尝试使用Regex101等工具进行现场测试和指南。我在上面链接了一个参考。正则表达式是一个有价值的工具。