我正在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