Доступное регулярное выражение для сопоставления строки и извлечения строки - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь найти строку после 1 пробела в строке, если она существует, затем извлечь всю строку и сохранить в другой переменной.Я использую ANSIBLE и регулярное выражение.Если строка существует в любом другом месте, то она не должна совпадать.

Я попытался использовать regex_match и выбрать, но получил ошибку.

  vars:
    input : "{{ lookup('template', '{{ file }}') }}"
    target: "{{ input | regex_search('^(?=.*\b INPUT\b)(?:\S+){1}(\S*.*)')}}"

Ошибка всегда появляется в одном и том же месте "(?: \ S +)".

ERROR! Syntax Error while loading YAML.
  found unknown escape character 'S'

The offending line appears to be:

    input : "{{ lookup('template', '{{ file }}') }}"
    target: "{{ input | regex_search('^(?=.*\b INPUT\b)(?:\S+){1}(\S*.*)')}}"

^ here
    input : "{{ lookup('template', '{{ file }}') }}"
    target: "{{ input | select('match', '^(?=.*\b INPUT\b)(?:\S+){1}(\S*.*)' | list | first}}"

^ here

Я также пытался включить escape-символ для /, но также получил ошибку,

ERROR! Syntax Error while loading YAML.
  found unknown escape character 'S'

The offending line appears to be:

   input : "{{ lookup('template', '{{ file }}') }}"
    target: "{{ input | regex_search('^(?=.*/\b INPUT/\b)(?:/\S){1}(/\S*.*)')}}"
                                                                                ^ here

Файл моей переменной

-P INPUT ACCEPT
-A INPUT -s 1.1.1.1/32 -j ACCEPT
-A INPUT -s 2.2.2.2/32 -j ACCEPT
-A INPUT -s 3.3.3.3/32 -j ACCEPT
-A INPUT -j RH-Firewall
-N RH-Firewall
-A RH-Firewall -j INPUT
-A RH-Firewall -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A RH-Firewall -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A RH-Firewall-1 -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A RH-Firewall -p icmp -m icmp --icmp-type 11 -j ACCEPT

target_rule_set должен содержать только первые 5 строк.Точно так же, если я сопоставляю RH-Firewall, он должен содержать строки 6-11.

1 Ответ

1 голос
/ 03 июля 2019

Вы можете использовать regex_findall с multiline=True:

(?m)^\S+\s+INPUT\b.*

См. Демоверсию regex . Подробности:

  • ^ - начать строку, так как используется (?m)
  • \S+ - 1+ непробельных символов
  • \s+ - 1+ пробелов
  • INPUT\b - INPUT как целое слово
  • .* - остаток строки.

В коде:

target: "{{ input | regex_findall('^\\S+\\s+INPUT\\b.*', multiline=True)}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...