Я наткнулся на поведение, которое я не могу объяснить, надеюсь, некоторые из вас, ребята, могут мне помочь.
Я пытаюсь сгенерировать некую документацию из более крупного проекта 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 (установка по умолчанию)