sed 正则表达式模式匹配贪婪,尽管它不应该

sed 正则表达式模式匹配贪婪,尽管它不应该

我偶然发现了一种无法解释的行为,希望你们中的一些人可以帮助我。

我尝试从一个更大的项目中生成一种文档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 行运行:

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'

由于这可能引起人们的兴趣,我在 ubuntu linux 上使用 sed-4.2.2-4ubuntu1(默认安装)

答案1

Sed 不支持非贪婪匹配,如“.*?”表达式所示。

尝试这个:

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

输出:

* targetA - 一些花哨的描述
 * targetB - 一些花哨的描述
 * targetC - 一些花哨的描述

相关内容