Использование sed или awk для извлечения текста из файла xml - PullRequest
0 голосов
/ 01 мая 2020
<?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 = "V701" V701 abc Этот заголовок в настоящее время не может

for id = "V702" Воспроизведение V702 В данный момент этот заголовок не может быть воспроизведен. Я хочу использовать его в сценарии bash, поэтому, пожалуйста, выводите вывод по одному на строку

1 Ответ

0 голосов
/ 01 мая 2020

Обычно лучше использовать инструмент, который понимает 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)
...