使用sed或awk从xml文件中提取文本

使用sed或awk从xml文件中提取文本,xml,shell,awk,sed,xml-parsing,Xml,Shell,Awk,Sed,Xml Parsing,使用此xml,我希望找到与特定id相关的所有标记的值 对于eg id=V701 V701 abc 此标题当前无法使用 对于id=V702 V702 玩 此标题当前无法播放 我想在bash脚本中使用它,所以请每行打印一个输出您通常最好使用能够理解XML的工具来解析XML文件,而不是尝试使用sed或awk之类的工具来解析它。例如,xmllint命令有一个-xpath选项,可用于从XML文件提取信息: <?xml version="1.0" encoding="utf-8"??> <

使用此xml,我希望找到与特定id相关的所有标记的值

对于eg id=V701 V701 abc 此标题当前无法使用

对于id=V702 V702 玩 此标题当前无法播放
我想在bash脚本中使用它,所以请每行打印一个输出

您通常最好使用能够理解XML的工具来解析XML文件,而不是尝试使用sed或awk之类的工具来解析它。例如,xmllint命令有一个-xpath选项,可用于从XML文件提取信息:

<?xml version="1.0" encoding="utf-8"??>
<resources>
<data id="V701">
    <string name="MSG_V701_ID">V701</string>
    <string name="MSG_V701_TITLE">abc</string>
    <string name="MSG_V701_BODY">This title is currently unable</string>
</data>
<data id="V702">
    <string name="MSG_V702_ID">V702</string>
    <string name="MSG_V702_TITLE">Play</string>
    <string name="MSG_V702_BODY">This title is currently unable to play</string>
如果需要单个字符串,可以执行以下操作:

$ result=$(xmllint --xpath "//data[@id='$ID']//text()" data.xml)
$ echo "$result"


V702


Play


This title is currently unable to play

如何使id=V702成为像id一样的通用方法可以是任何东西,因为我将传递变量而不是V702。您可以将您的目标id放入变量中并使用它。我已经更新了答案以反映这一点。由于输出显示在一行中,如何将输出显示到另一行意味着如何断开该行,很抱歉,我不理解您在最后一条评论中提出的问题。V702播放此标题当前无法播放。当我回显变量以显示输出时,它只在一行中显示输出,如何逐行显示输出。
$ result=$(xmllint --xpath "//data[@id='$ID']//text()" data.xml)
$ echo "$result"


V702


Play


This title is currently unable to play
title=$(xmllint --xpath "//data[@id='$ID']/string[@name='MSG_${ID}_TITLE']/text()" data.xml)
body=$(xmllint --xpath "//data[@id='$ID']/string[@name='MSG_${ID}_BODY']/text()" data.xml)