Как захватить строку с помощью соответствия регулярному выражению и выяснить, присутствует ли она в строке или нет, и дополнительно сгруппировать ее - PullRequest
1 голос
/ 20 марта 2020

Я хочу заменить строку на строку, которая соответствует другому набору строк, как указано ниже

Регулярное выражение:

- replace: 
    path: /etc/pam.d/system-auth
    regexp: '^(password\s+sufficient\s+pam_unix\.so.*)( remember=\d+)(.*)$'
    replace: '\1\3 remember=8'

Желаемое совпадение:

password  sufficient  pam_unix.so sha512 shadow nullok try_first_pass use_authtok              <<< my regex not works! 
password  sufficient  pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=7   <<< works!
password  sufficient  pam_unix.so sha512 shadow remember=8 nullok try_first_pass use_authtok   <<< works!

и я хочу заменить его на

password  sufficient  pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=8

Как я могу узнать, существует ли он в одном go (возможно, в одной строке). Спасибо. Я использую Ansible. пс. Я плохо разбираюсь в английском sh, извините.

1 Ответ

0 голосов
/ 20 марта 2020

Вы можете использовать 3 группы захвата и сделать необязательными последние 2 группы захвата, так как часть запоминания, за которой следуют цифры, и то, что может последовать, не обязательно будут там.

Вы можете добавить границу слова \b после сопоставления цифр для запоминания, чтобы совпадение не было частью большего слова.

^(password\s+sufficient\s+pam_unix\.so.*?)(?:( remember=\d+\b)(.*))?$

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...