Ну видимо проблема была в диапазоне ip... Я поменял 10.7.0.0 на 10.8.1.0 и все заработало почти сразу...
Странно, потому что у меня нет другой сети в этом диапазоне.
Я не думаю, что есть способ сделать это с помощью POSIX-совместимого grep
или awk
, потому что стандарт требует самого длинного совпадения, действительно (см., например, regex(7)
справочную страницу ).
С помощью awk
вы можете получить желаемый результат, изменив программу awk
и регулярное выражение, например
echo 'SetValue' | awk '{ if (match($0, /Set(Value)?/)) { print substr($0, RSTART, 3); }
В этой ситуации я бы взялpcregrep
(часть библиотеки регулярных выражений, совместимую с pcre perl ), которая позволяет указать пронумерованную подгруппу с помощью-o
:
echo SetValue | pcregrep -o1 '(Set)(Value)?'
или, поскольку pcre имеет синтаксис для не -жадного сопоставления,
echo SetValue | pcregrep -o0 'Set(Value)??'
Насколько я мог это понять, получается, что на самом деле есть две машины NFA:
Традиционный двигатель NFA
Машина NFA, которая откатывается назад и для которой самое длинное -самое левое совпадение, не всегда может соблюдаться .
Механизм POSIX NFA
Механизм NFA без возврата -, который обрабатывает все состояния параллельно и может выбрать любое совпадение во входной строке. Выбор самого левого и самого длинного совпадения является требованием POSIX.
Однако машина обратного поиска DFA (Perl ), которая может раздуваться экспоненциально (2^n)управляется текстом (, а не регулярным выражением ), и может выбирать первым из чередования (или нет ).
Также говорят, что DFA распознает все возможные совпадения параллельно .
И, от автора статьи, связанной с вопросом, реализация re2 определяет чередование как :x|y ==> x или y (предпочитает x ), то есть :предпочитают первое из чередования.
Таким образом, в заключение, нет никакого способа фактически связать NFA или DFA с тем, какая часть чередования будет выбрана, это зависит от конкретной реализации.
И нет, я не нашел способа указать конкретной реализации изменить значение по умолчанию.
Связанные: