Как сопоставить символ в середине строки с известным, но префиксным размером префикса
Чтобы быть более конкретным, есть строка (среди других строк в данной строке):
sudo:x:27:foo,bar,baz
^---we need to match this character
Префикс известен и может быть выражен как ^sudo:x:\d+
Проблема: положительный взгляд за утверждением должен быть фиксированного размера, иначе я бы использовал (?<=sudo:x:\d+)
Вопрос: как соответствовать этому точному двоеточию (и это должен быть единственный подобранный символ)
Детская площадка: http://regex101.com/r/gG9vW6/2
PS: Для тех, кому интересно, зачем мне это:
Это только часть более крупной задачи, которая может быть выражена следующим образом: добавить пользователя в группу sudo, если он еще не существует, со следующими ограничениями синтаксического анализатора (он исходит из используемого программного обеспечения, его нельзя изменить):
- Вы можете выполнять только операцию замены, поэтому вам нужно сопоставить любой символ
- Технически невозможно использовать регулярное выражение
(matches)
и ссылки в строке замены
ОБНОВИТЬ
Есть способ использовать (matches)
так что это больше не проблема:-)
Вот как можно сослаться на совпадения в cfengine:
$(match.N)
где N - индекс группы захвата.
См.: https://docs.cfengine.com/docs/3.5/manuals-language-concepts-pattern-matching-and-referencing.html
1 ответ
(?=^sudo:x:\d+:.*$)(.*):
Вы можете попробовать это.
Заменить:
$(match.1)<your char>
Смотрите демо для эквивалентной версии в PCRE.