加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:26:48 所属栏目:大数据 来源:网络整理
导读:这是我的第一篇文章,所以请承担与我。我有一个文件,看起来像这样: table name="content_analyzer" primary-key="id" type="global" //tabletable name="content_analyzer2" primary-key="id" type="global" //tabletable name="content_analyzer_items" p
这是我的第一篇文章,所以请承担与我。我有一个文件,看起来像这样:
<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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读