如何使用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

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...