【问题标题】:Bash - grep text inside XML tags that contain unique alphanumeric stringsBash - 包含唯一字母数字字符串的 XML 标记内的 grep 文本
【发布时间】:2015-08-14 00:21:47
【问题描述】:

我想使用 grep 提取这些 XML 标记中的文本(没有 XMLStarlet 或类似工具,尽管它们会更容易)。我以前用 grep 做过这个,但这个特殊情况有点复杂。标签包含带有连字符的唯一字母数字标识符(MusicBrainz ID):

<artist mbid="eaefd603-84c1-4db4-a72b-0cb718a0cc07">Chelsea Wolfe</artist>

我已经尝试过这个和许多变体:

grep -Po '(?<=<artist mbid=.*?>).*?(?=</artist>)'

在几乎所有情况下,我都会收到“grep:lookbehind assertion is not fixed length”。在 Perl 中,iirc,\K 是该错误的解决方案,但我不确定该放在哪里(我是一个正则表达式新手,以防你不知道)。我通过简单的反复试验没有成功。

我花了几个小时搜索 SO 和 Google,但找不到任何类似的东西可以提供帮助(可能我错过了一些东西)。所以,我的问题是:使用 grep,当这些标签包含唯一的字母数字标识符时,如何提取标签之间的文本?

【问题讨论】:

  • 唯一的字母数字标识符是否总是相同的长度? (有时是)
  • 是的,它们似乎总是 36 个字符(包括连字符)

标签: regex xml linux bash grep


【解决方案1】:

要使用\K("keep out" -- 删除到目前为止匹配的内容),请尝试

grep -oP '<artist mbid=.*?>\K.*?(?=</artist>)'

即你把\K放在你想从比赛中删除的位之后。

否则如果你想使用lookbehind:

如果您不希望“>”出现在艺术家的名字中,并且您希望您的 XML 格式正确(没有不匹配的标签),并且您不希望标签嵌套在 inside艺术家,试试

grep -Po '(?<=>)[^>]+(?=</artist>)'

【讨论】:

  • 第一个完美运行。我实际上已经尝试过了,但是 &lt;artist mbid=*?&gt; 没有返回任何结果,所以我认为 /K 的位置错误。谢谢你。除了我想匹配的标签之外,第二个代码示例还匹配了许多其他标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 2022-01-20
  • 2013-12-07
相关资源
最近更新 更多