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

Using sed or awk to extract text from xml file

<?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>

使用这个 xml 我想找到与特定 id

相关的所有标签的值

例如 id="V701" V701 美国广播公司 此标题目前无法使用

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

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

$ ID=V702
$ result=$(xmllint --xpath "//data[@id='$ID']" data.xml)
$ echo "$result"
<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>
</data>

甚至:

$ 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)