Сопоставление литералов с фильтром Ansible 'regex_replace'

Я не могу найти способ получить много буквального (точки) в фильтре Ansible regex_replace. Вот задача:

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

Я намерен сопоставить и заменить весь URL-адрес, например test.staging.domain.com его первой частью (test в примере).

Ansible сообщит о следующей ошибке:

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

Мы могли ошибаться, но похоже, что это проблема с отсутствующими кавычками. Всегда заключайте в кавычки скобки выражения шаблона, когда они начинают значение.

Как сопоставить литералы в фильтре Ansible regexp_replace?


person luqo33    schedule 17.09.2016    source источник


Ответы (3)


на самом деле можно избежать литералов с двойным люфтом:

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

Регулярное выражение выше работает правильно. Первая группа захвата извлекает первую часть URL-адреса до первой точки, все регулярное выражение захватывает весь URL-адрес. Если пройти через него test.staging.domain.co m, будет получен только test.

person luqo33    schedule 17.09.2016

Я пытался сделать то же самое, но в итоге сделал вот так:

- 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] }}
person gaddman    schedule 18.04.2017
comment
Решение .split выглядит гладким! - person Drew; 03.05.2018

В экранировании символов может быть что-то странное, но есть способ без экранирования закодировать буквальную точку:

[.]

Итак, ваше регулярное выражение может быть написано

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

Большинство символов теряют свое особое значение в классе символов, и точка является одним из них.

person Bohemian♦    schedule 17.09.2016