Я пытаюсь понять поведение SED WRT это регулярное выражение:
sed -n "s/.*Directory \([^>]*\)>/\1/p" /etc/apache2/sites-enabled/*
Weird СЕПГ жадный регулярное выражение поведение
Целью здесь является указать путь к корневой директории всех включенных виртуальных хостов в Apache2.
Странная вещь, что результат этой команды образца:
sed -n "s/.*Directory \([^>]*\)>/\1/p" <<< "<Directory /var/www/my_site>"
, как и ожидалось: /var/www/my_site
Но результат sed -n "s/.*Directory \([^>]*\)/\1/p" <<< "<Directory /var/www/my_site>"
является: /var/www/my_site>
Я знаю, что разница является наличие от >
. Вопрос в том, почему необходимо добавить >
для получения правильного вывода? [^>]*
должен быть в состоянии соответствовать всем и останавливаться на >
, не фиксируя его в круглых скобках.
Я не понимаю, почему символ '>' попадает в первую команду, а не во вторую. [^>]
должен исключил «>» из захватывающих скобок ...
1-я команда имеет '>' в поисковом выражении, а у 2-го ее нет. – anubhava
Я это знаю. Вопрос в том, почему необходимо добавить '>' для получения правильного вывода? '[^>] *' должен иметь возможность сопоставлять все и останавливаться на '>', таким образом, не фиксируя его в круглых скобках. – mak
Вы не соответствуете '>' во второй команде, поэтому она не входит в замену и остается неизменной. Вы заменяете '([^>] * \)' на себя, остальная часть строки остается неизменной.Если вы просто хотите, чтобы в скобках добавить '. *' До конца команды вне скобок. –