我有一个类似如下的文件:
<table name="content_analyzer" primary-key="id">
<type="global" />
</table>
<table name="content_analyzer2" primary-key="id">
<type="global" />
</table>
<table name="content_analyzer_items" primary-key="id">
<type="global" />
</table>我需要提取name=后面的引号中的任何内容,即content_analyzer、content_analyzer2和content_analyzer_items。
我是在Linux机器上这样做的,所以使用sed、perl、grep或bash的解决方案就可以了。
发布于 2011-02-23 01:21:06
由于您需要匹配内容而不将其包含在结果中(必须匹配name=",但它不是所需结果的一部分),因此需要某种形式的零宽度匹配或组捕获。这可以通过以下工具轻松完成:
Perl
使用Perl,您可以使用n选项逐行循环,如果匹配,则打印捕获组的内容:
perl -ne 'print "$1\n" if /name="(.*?)"/' filenameGNU grep
如果您有一个改进的grep版本,比如GNU grep,那么可以使用-P选项。该选项将启用类似Perl的正则表达式,允许您使用\K,这是一种速记查找。它将重置匹配位置,因此它之前的任何内容都是零宽度。
grep -Po 'name="\K.*?(?=")' filenameo选项使grep只打印匹配的文本,而不是整行。
Vim - Text编辑器
另一种方法是直接使用文本编辑器。对于Vim,实现这一点的各种方法之一是删除不带name=的行,然后从结果行中提取内容:
:v/.*name="\v([^"]+).*/d|%s//\1标准grep
如果您由于某种原因无法使用这些工具,则可以使用标准grep来实现类似的功能。然而,如果没有环顾四周,它将需要稍后进行一些清理:
grep -o 'name="[^"]*"' filename关于保存结果的说明
在上面的所有命令中,结果都将发送到stdout。重要的是要记住,你总是可以通过管道将其附加到文件中来保存它们:
> result到命令的末尾。
发布于 2011-02-23 00:39:26
正则表达式为:
.+name="([^"]+)"则分组将在\1中
发布于 2011-02-23 00:43:02
如果您使用的是Perl,请下载一个模块来解析XML:XML::Simple、XML::Twig或XML::LibXML。不要重复发明轮子。
https://stackoverflow.com/questions/5080988
复制相似问题