Шаблон 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 - немного необычного описания
Другие вопросы по тегам