Получить строковые значения тегов в массиве, используя сценарий оболочки - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть XML файл в формате:

<classes>

 <subject>
  <name>Operating System</name>
  <credit>3</credit>
  <type>Theory + Lab</type>
  <faculty>Prof. XYZ</faculty> 
 </subject>

 <subject>
  <name>Web Development</name>
  <credit>3</credit>
  <type>Only Lab</type>
 </subject>

</classes>

Ожидаемый вывод:

index 0 : Operating System
index 1 : 3
index 2 : Theory + Lab
index 3 : Prof. XYZ
index 4 : Web Development
index 5 : 3
index 6 : Only Lab

Я пытался использовать команду sed, но команда не сохраняет результат в желаемом формате.

Команда:

declare -a totalArray=($(sed -n '/\s*<subject>/,/<\/subject>/p' file.xml | sed -e 's/<[^>]*>//g' -e '/^\s*$/d' -e 's/\s*//g'))

И когда я печатаю элементы массива, я получаю результаты как:

index 0 : OperatingSystem
index 1 : 3
index 2 : Theory+Lab
index 3 : Prof.XYZ
index 4 : WebDevelopment
index 5 : 3
index 6 : OnlyLab 

Мне нужны предложения о том, как добавить пробелы между двумя словами.

1 Ответ

0 голосов
/ 11 апреля 2020

sed не является оптимальной программой для такого рода задач. Вам лучше использовать программу . Он был специально разработан для такого рода задач. Так что используйте эту команду (которая является однострочной версией таблицы стилей XSLT):

xmlstarlet sel -t -m "/classes/subject/*" -v "concat('index ',position()-1,' : ',.)" -n input.xml

Ее вывод:

index 0 : Operating System
index 1 : 3
index 2 : Theory + Lab
index 3 : Prof. XYZ
index 4 : Web Development
index 5 : 3
index 6 : Only Lab

Здесь доступны параметры

  • sel: выбирает режим «выбора»
  • -t: режим шаблона
  • -m: соответствует выражению XPath
  • -v: извлекает значение относительно узла контекста (здесь устанавливается параметром -m)
  • -n: выводит новую строку после каждого совпадения
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...