![sed 正则表达式模式匹配贪婪,尽管它不应该](https://linux22.com/image/1444024/sed%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%A8%A1%E5%BC%8F%E5%8C%B9%E9%85%8D%E8%B4%AA%E5%A9%AA%EF%BC%8C%E5%B0%BD%E7%AE%A1%E5%AE%83%E4%B8%8D%E5%BA%94%E8%AF%A5.png)
我偶然发现了一种无法解释的行为,希望你们中的一些人可以帮助我。
我尝试从一个更大的项目中生成一种文档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 -nr 's/.*target name="([^"]*)" .*="(.*)".*/ * \1 - \2/p' file
输出:
* targetA - 一些花哨的描述 * targetB - 一些花哨的描述 * targetC - 一些花哨的描述