首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用grep、regex或perl提取模式后的字符串

如何使用grep、regex或perl提取模式后的字符串
EN

Stack Overflow用户
提问于 2011-02-23 00:34:07
回答 8查看 252.7K关注 0票数 101

我有一个类似如下的文件:

代码语言:javascript
复制
    <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_analyzercontent_analyzer2content_analyzer_items

我是在Linux机器上这样做的,所以使用sed、perl、grep或bash的解决方案就可以了。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2011-02-23 01:21:06

由于您需要匹配内容而不将其包含在结果中(必须匹配name=",但它不是所需结果的一部分),因此需要某种形式的零宽度匹配或组捕获。这可以通过以下工具轻松完成:

Perl

使用Perl,您可以使用n选项逐行循环,如果匹配,则打印捕获组的内容:

代码语言:javascript
复制
perl -ne 'print "$1\n" if /name="(.*?)"/' filename

GNU grep

如果您有一个改进的grep版本,比如GNU grep,那么可以使用-P选项。该选项将启用类似Perl的正则表达式,允许您使用\K,这是一种速记查找。它将重置匹配位置,因此它之前的任何内容都是零宽度。

代码语言:javascript
复制
grep -Po 'name="\K.*?(?=")' filename

o选项使grep只打印匹配的文本,而不是整行。

Vim - Text编辑器

另一种方法是直接使用文本编辑器。对于Vim,实现这一点的各种方法之一是删除不带name=的行,然后从结果行中提取内容:

代码语言:javascript
复制
:v/.*name="\v([^"]+).*/d|%s//\1

标准grep

如果您由于某种原因无法使用这些工具,则可以使用标准grep来实现类似的功能。然而,如果没有环顾四周,它将需要稍后进行一些清理:

代码语言:javascript
复制
grep -o 'name="[^"]*"' filename

关于保存结果的说明

在上面的所有命令中,结果都将发送到stdout。重要的是要记住,你总是可以通过管道将其附加到文件中来保存它们:

代码语言:javascript
复制
> result

到命令的末尾。

票数 194
EN

Stack Overflow用户

发布于 2011-02-23 00:39:26

正则表达式为:

代码语言:javascript
复制
.+name="([^"]+)"

则分组将在\1中

票数 5
EN

Stack Overflow用户

发布于 2011-02-23 00:43:02

如果您使用的是Perl,请下载一个模块来解析XML:XML::SimpleXML::TwigXML::LibXML。不要重复发明轮子。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5080988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档