У меня такая проблема. Мне нужно найти регуляркой группу, после которого надо написать строку, начинающуюся с нолика. Делаю я это для плейбука Ansible:
- name: Переключение сетевой маски доступа PostgreSQL для сетей IPv4
lineinfile:
destfile: /etc/postgresql/9.1/main/pg_hba.conf
regexp: '(^host\s*all\s*all\s*)\d+\.\d+\.\d+\.\d+\/\d+\s*md5'
line: '\10.0.0.0/0 md5'
backrefs: yes
Проблема в том, что ссылка назад с номером 1 не определяется. Ansible думает, что я хочу использовать ссылку с номером 10.
Ошибка такая:
fatal: [arm2]: FAILED! => {«changed»: false, «failed»: true, «module_stderr»: «Shared connection to 192.168.111.102 closed.\r\n», «module_stdout»: «Traceback (most recent call last):\r\n File \»/tmp/ansible_AT9bap/ansible_module_lineinfile.py\", line 425, in <module>\r\n main()\r\n File \«/tmp/ansible_AT9bap/ansible_module_lineinfile.py\», line 417, in main\r\n ins_aft, ins_bef, create, backup, backrefs)\r\n File \«/tmp/ansible_AT9bap/ansible_module_lineinfile.py\», line 252, in present\r\n b_new_line = m.expand(b_line)\r\n File \«/usr/lib/python2.7/re.py\», line 266, in _expand\r\n return sre_parse.expand_template(template, match)\r\n File \«/usr/lib/python2.7/sre_parse.py\», line 789, in expand_template\r\n raise error, \«invalid group reference\»\r\nsre_constants.error: invalid group reference\r\n", «msg»: «MODULE FAILURE»}
Если я заменю вот так, то ошибки нет:
line: '\1a.b.c.d/e md5'
Вроде как обычные регулярки такие случаи правильно разруливают: например, если ссылки назад с номером 10 нет, будет использоваться номер 1, а 0 будет рассматриваться как символ. Но в Ansible это не так.
Вопрос: как обойти эту особенность, и написать ссылку назад \1 и после нее символ 0?