我偶然发现了一种无法解释的行为,希望你们中的一些人可以帮助我。
我尝试从一个更大的项目中生成一种文档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 - 一些花哨的描述