我正在编写一个脚本,从我们的模板系统中过滤掉所有的可翻译内容。我面临的问题是两个可翻译内容出现在一行上的情况。
这是模板文件中的 2 个示例行,它们都包含一个或多个可翻译内容
<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#]
当我设置以下正则表达式时
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#]
答案1
同意 Kyle 的观点。但是,在这种情况下,您可以这样做:egrep "\[#([^]])*)#\]" . -Rohis
并得到您想要的东西。
匹配[^]]*
非]
字符,因此它会在第一个]
遇到的字符处停止。
答案2
尝试使用正则表达式解析 HTML 会带来麻烦,所以不要这么做。Jeff 在用 Cthulhu 方式解析 HTML。“但我只想______”,没关系,说真的,别这么做。花点时间学习一些专门用于解析 html 的东西。
我个人建议使用 Perl 模块来实现这一点(例如HTML::TreeBuilder),但你知道哪些语言?其他选项有:tidy+ xmlstarlet xmlgawk xpath xml2。
如果您只想要文本中“呈现”的 html,则可以使用类似链接的内容:links -dump www.google.com
答案3
同意凯尔的评论。
无论如何,如果模式足够统一,你可以通过匹配任何字符来实现你想要的,除了结束字符,即
egrep "\[#([^]]*)#\]" ...
如果文本中有结束的 ],则此模式将不起作用,例如 [#xyz]#] 将不匹配。
答案4
使用 Perl,它允许您进行非贪婪匹配。对于您观看多个匹配的情况,请使用 /g 修饰符进行操作。我们添加 -l 开关是因为我们必须自己处理换行符:
perl -lne'while(/\[#(.*?)#\]/g) {print $&}' filename