ubuntu 上非贪婪的 grep 命令?

ubuntu 上非贪婪的 grep 命令?

我正在编写一个脚本,从我们的模板系统中过滤掉所有的可翻译内容。我面临的问题是两个可翻译内容出现在一行上的情况。

这是模板文件中的 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

相关内容