将文字与'regex_replace'Ansible过滤器匹配

luq*_*o33 4 regex ansible

在Ansible的regex_replace过滤器中,我无法找到更多文字(点)的方法.这是任务:

- name: Display database name
  debug:
    msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}"
  tags: [debug]
Run Code Online (Sandbox Code Playgroud)

我的目的是匹配并替换整个URL,如test.staging.domain.com及其第一部分(示例中的测试).

Ansible会报告以下错误:

debug:
  msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}"
                                     ^ here
Run Code Online (Sandbox Code Playgroud)

我们可能是错的,但这个看起来可能是缺少引号的问题.在启动值时始终引用模板表达式括号.

如何匹配Ansible regexp_replace过滤器中的文字?

luq*_*o33 6

它实际上可以通过双反斜杠来逃避文字:

- name: Create database name and username
  set_fact:
    db_name: "{{ vhost | regex_replace('([^\\.]*)\\.(.+)$', '\\1') }}_stg"
Run Code Online (Sandbox Code Playgroud)

上面的正则表达式正常工作.第一个捕获组提取URL的第一部分直到第一个点,整个正则表达式捕获整个URL.通过test.staging.domain.co m 传递它只会产生测试.


Boh*_*ian 4

转义字符可能会有些奇怪,但是有一种无需转义的方法来编码文字点:

[.]
Run Code Online (Sandbox Code Playgroud)

所以你的正则表达式可以写成

(.+[.])(.+)$
Run Code Online (Sandbox Code Playgroud)

大多数字符在字符类中都会失去其特殊含义,点就是其中之一。