Я наткнулся на поведение, которое я не могу объяснить, надеюсь, некоторые из вас, ребята, могут мне помочь.

Я пытаюсь сгенерировать некую документацию из более крупного проекта 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 ответ1

1

Sed не поддерживает не жадные совпадения, как показано в ".*?"выражение.

Попробуй это:

sed -nr 's/.*target name="([^"]*)" .*="(.*)".*/ * \1 - \2/p' file

Выход:

 * targetA - some fancy description
 * targetB - some fancy description
 * targetC - some fancy description

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .