Шаблон Sed Regex соответствует жадному алгоритму, хотя не должен
Я наткнулся на поведение, которое не могу объяснить, надеюсь, некоторые из вас, ребята, могут мне помочь.
Я пытаюсь сгенерировать своего рода документацию из большего Ant
проект, как таковой я использую sed
чтобы отфильтровать информацию из файлов, что мне нужно в документации позже.
У меня есть обычный сборочный файл ant с такими строками:
<target name="targetA" depends="targetD" description="some fancy description">
...
<target name="targetB" depends="targetD" description="some fancy description">
...
<target name="targetC" depends="targetD" description="some fancy description">
Теперь я бегу по этой строке:
sed -nr 's/.*?target name="(.*?)".*="(.*?)".*/ * \1 - \2/p'
Это должно дать мне:
* targetA - some fancy description
* targetB - some fancy description
* targetC - some fancy description
Вместо этого я получаю:
* targetA" depends="targetD" - some fancy description
* targetA" depends="targetD" - some fancy description
* targetA" depends="targetD" - some fancy description
Я попытался пропустить вывод второй группы, чтобы убедиться, что это первая группа, которая на самом деле соответствует целой части "зависит" с ней, хотя я установил регулярное выражение как не жадное до следующей двойной кавычки.
Что мне здесь не хватает?
Использование более явного регулярного выражения, как это работает как ожидалось, но я все еще не понимаю жадность:
sed -nr 's/.*?target name="(.*?)".*=.*="(.*?)".*/ * \1 - \2/p'
Как это может быть интересно, я использую sed-4.2.2-4ubuntu1 на Ubuntu Linux (установка по умолчанию)
1 ответ
Sed не поддерживает не жадные совпадения, как показано в ". *?" выражение.
Попробуй это:
sed -nr 's/.*target name="([^"]*)" .*="(.*)".*/ * \1 - \2/p' file
Выход:
* targetA - немного необычного описания * targetB - немного необычного описания * targetC - немного необычного описания