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

搜索模式Y后提取与模式X匹配的文本(bash),bash,awk,sed,grep,Bash,Awk,Sed,Grep,在bash脚本中,如何从以abc开头、以/abc结尾的XML文件中提取文本,该文件位于我需要查找的模式之后? 输入文件的示例: <111> <abc> text </abc> <def> text </def> </111> <222> <abc> text to extract </abc> </222> 文本 文本 要提取的文本 我的目标是显示“要提取的文本”,表明我

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

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

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

  • 您的xml示例没有根元素
  • 不是有效的xml标记名
  • 如果您不确定您的xml格式是固定的,请不要使用正则表达式来解析它
  • xpath将是一条出路
  • 假设111222标记名为
    t111
    t222
    ,并且您有一个根元素

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

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

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

    在找到您的模式后,它最多需要999行,然后,从中,它获取
    后面的一行,并从中获取最后一行。

    使用GNU awk进行多字符RS和gensub()

    $awk-vrs='^$'{print gensub(/.*.*.\n(.*)\n.*/,“\\1”,”“)}文件
    要提取的文本
    
    如果是有效的XML文件,请使用XML解析器,如xmlint或xmlstarlet。@约翰:如果您不知道t222后面的标记,并且希望去掉换行符:
    xmllint--xpath//t222/*/text()“your.XML|grep.
    $ awk -v RS='^$' '{print gensub(/.*<222>.*<abc>\n(.*)\n<\/abc>.*/,"\\1","")}' file
    text to extract