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

时间:2016-09-17 09:33:24

标签: regex ansible

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

vsn_list=['1.23', '1.8.1.1']
print sorted( [ [int(v) for v in x.split(".")] for x in vsn_list ] )

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

Ansible会报告以下错误:

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

我们可能错了,但这个看起来可能是一个问题   缺少报价。始终引用模板表达式括号   开始一个价值。

如何在Ansible debug: msg: "{{ vhost | regex_replace('(.+\.)(.+)$', \\1) }}" ^ here 过滤器中匹配文字?

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

我试图做同样的事情,最后这样做:

- name: Set hostname (minus the domain)
  debug: msg={{ inventory_hostname | regex_replace('^([^.]*).*', '\\1') }}

*编辑,找到了更好的方法:

- name: Set hostname (minus the domain)
  debug: msg={{ inventory_hostname.split('.')[0] }}

答案 2 :(得分:1)

对于逃避字符可能有些不妥,但是有一种无法逃脱的方法来编写字面点:

[.]

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

(.+[.])(.+)$

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