非贪婪grep命令在Ubuntu?

我正在build立一个脚本,从我们的模板系统中过滤出所有的翻译。 我面临的问题是两个translatables是在一个线路上的场合。

这些是来自模板文件的两行示例,它们都包含一个或多个翻译

<img src="/captcha/generate.jpg" alt="[#Captcha#]" /> <span>[#Velden met een * zijn verplicht in te vullen#]</span> <button type="submit" name="frm_submit" class="right">[#Verzend#] 

当我放松下面的正则expression式

 egrep "\[#(.*)#\]" . -Rohis 

我得到这个输出

 [#Captcha#]" [#Velden met een * zijn verplicht in te vullen#]</span> <button type="submit" name="frm_submit" class="right">[#Verzend#] 

而期望的输出是

 [#Captcha#] [#Velden met een * zijn verplicht in te vullen#] [#Verzend#] 

同意凯尔。 但是,在这种情况下,您可以这样做: egrep "\[#([^]])*)#\]" . -Rohis egrep "\[#([^]])*)#\]" . -Rohis并得到你在找什么。

[^]]*匹配非]字符,所以它会在第一个字符停止。

试图用正则expression式parsingHTML会导致痛苦,就是不要这样做。 杰夫在parsingHtml The Cthulhu Way中写下了它。 “但是我只想……”,没关系,认真的,不要这样做。 花点时间学习一些devise来parsinghtml的东西。

我个人会推荐一个Perl模块(比如HTML :: TreeBuilder ),但是你知道什么语言? 其他选项有:tidy + xmlstarlet xmlgawk xpath xml2。

如果你只是想在文本中“呈现”的HTML,你可以使用像链接: links -dump www.google.com

借调凯尔评论。

无论如何,如果模式足够统一,你可以实现你想要我的匹配什么,但最后的字符,即

 egrep "\[#([^]]*)#\]" ... 

如果你在文本内部closures,这种模式将不起作用,例如[#xyz]#]不匹配。

使用Perl,它可以让你做非贪婪的匹配。 对于你观看多个比赛的情况,请使用/ g修饰符。 我们添加-l开关,因为我们必须自己处理换行符:

 perl -lne'while(/\[#(.*?)#\]/g) {print $&}' filename