在搜索模式Y(bash)后提取匹配模式X的文本

时间:2014-10-02 08:43:28

标签: bash awk sed grep

在bash脚本中,我如何能够从以abc结尾的XML文件中提取文本以/ abc结尾,这是在我需要查找的模式之后? 输入文件的例子:

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

我的目标是显示&#34;文本以提取&#34;表示我正在寻找模式&lt; 222&gt;。

3 个答案:

答案 0 :(得分:1)

  1. 您的xml示例没有根元素?
  2. <111> <222>不是有效的xml标记名称
  3. 如果您不确定xml格式是否已修复,请不要使用正则表达式进行解析
  4. xpath将是最佳选择
  5. 假设111,222标记名为t111t222并且您有一个根元素。

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

答案 1 :(得分:0)

这真的太丑了,你真的应该使用@ Kent的答案,但如果你真的,真的坚持:

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

找到您的模式<222>后最多需要999行,然后,从那里开始,它需要<abc>之后的单行,并且从最后一行开始。

答案 2 :(得分:0)

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

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