使用 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 文件,而不是尝试使用 sed
或 awk
之类的工具来解析它.例如,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)
<?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 文件,而不是尝试使用 sed
或 awk
之类的工具来解析它.例如,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)