微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用GREP,REGEX或PERL提取符合模式的字符串

这是我的第一篇文章,所以请承担与我。我有一个文件,看起来像这样:
<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的解决方案是好的。

谢谢!

解决方法

旧版本的答案:

我认为最简单的单行解决方案(没有编写完整的脚本)将是使用grep:

grep -no 'name="[^"]*"' file.html

在这行:

> n选项将打印与模式匹配的行。只是信息的原因,乍一看。删除如果你不想要它。
> o选项仅打印匹配的文本,而不打印整行。
> file.txt是文件的路径。

此外,如果您想要将结果保存到文件,您可以通过追加> results.txt:

grep -o 'name="[^"]*"' file.html > results.txt

这里的一个大问题是grep不支持环视(至少我不这么认为)。因此,结果将是:

name="content_analyzer"
name="content_analyzer2"
name="content_analyzer_items"

它需要一些清理。这很容易在你的文本编辑器中做一些find / replace …但这就是为什么它不是一个完整的解决方案。

我怎么会这样做

在Vim中:-)

第一步
删除任何不包含name =的行

:v/name=/d

第二步
提取name =“”内的内容

:%s/^.*name="\([^"]*\)".*$/\1

邦,甚至不必走出文本编辑器。

更新

正如丹尼斯·威廉姆森在评论中所说,grep确实有使用-P选项的环境,根据手册将模式解释为一个Perl正则表达式。太棒了!

所以这里是明确的一线解决方案:

grep -Po 'name="\K.*?(?=")' file.txt

原文地址:https://www.jb51.cc/Perl/173467.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐