【问题标题】:Extract text matching pattern X after having searched for pattern Y (bash)搜索模式 Y (bash) 后提取匹配模式 X 的文本
【发布时间】:2014-10-02 21:10:46
【问题描述】:

在 bash 脚本中,我如何能够从以 abc 开头并以 /abc 结尾的 XML 文件中提取文本,该文件位于我需要查找的模式之后? 输入文件示例:

<111>
<abc>
text
</abc>
<def>
text
</def>
</111>
<222>
<abc>
text to extract
</abc>
</222>

我的目标是显示“要提取的文本”,表明我正在寻找模式 。

【问题讨论】:

  • 如果它是有效的 XML 文件,请使用 XML 解析器,如 xmlint 或 xmlstarlet。

标签: bash awk sed grep


【解决方案1】:
  1. 您的 xml 示例没有根元素?
  2. &lt;111&gt; &lt;222&gt; 不是有效的 xml 标记名称
  3. 如果您不确定您的 xml 格式是否固定,请不要使用正则表达式对其进行解析
  4. xpath 将是要走的路

假设名为 t111t222 的 111,222 标签有一个根元素。

xmllint --xpath "//t222/abc/text()" your.xml

【讨论】:

  • @John:如果你不知道 t222 之后的标签并且你想去掉换行符:xmllint --xpath "//t222/*/text()" your.xml | grep .
【解决方案2】:

这真的很难看,你真的应该使用@Kent 的答案,但如果你真的,真的坚持:

grep -A 999 "<222>" file.xml | grep -A1 "<abc>" | tail -n 1

在找到你的模式&lt;222&gt; 后最多需要 999 行,然后,它会在 &lt;abc&gt; 之后的单行,然后是最后一行。

【讨论】:

    【解决方案3】:

    将 GNU awk 用于多字符 RS 和 gensub():

    $ awk -v RS='^$' '{print gensub(/.*<222>.*<abc>\n(.*)\n<\/abc>.*/,"\\1","")}' file
    text to extract
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      相关资源
      最近更新 更多