Intereting Posts
Как установить сценарий, который он будет запускать при запуске во FreeBSD? find: Что значит «-a» иметь более высокий приоритет, чем «-o»? Как вы пишете grub.cfg menuentry для Debian Netinst (8.2 от написания) для загрузки через USB? удаленный дисплей X не открывается Что-то вроде символически связанного файла, но с привязанными данными изменения? заменить путь unix внутри файла Как использовать опцию '-config' для `setxkbmap`? Как синхронизировать два диска (или папки) с использованием символических (или жестких) ссылок (например, rsync)? Как получить строки, чей n-й столбец содержит m-й столбец значение переменной оболочки для цикла, отличного от цикла Итерация через подкаталоги и выполнение awk-скрипта для определенных файлов В чем преимущество логического рабочего каталога? Какой процесс использует http-proxy 8080 Как исправить файл автозаполнения вкладки имени файла Linux, который добавляет пробел вместо конечной косой черты в каталогах? Альтернативы оконному менеджеру FVWM?

Как преобразовать общий формат XML-формата в формат свойств String из XML-файла с помощью скрипта ksh

С условиями:

  1. Я не могу использовать инструмент анализа XML, поскольку у меня нет разрешения, только для чтения

  2. Моя версия xmllint не поддерживает xpath, и я не могу ее обновить, только для чтения

  3. Я не имею xmlstarlet и не могу установить его

Мои параметры ограничены почти строковой обработкой.

Пользовательский параметр будет предоставлен пользователем, и это будет имя блока.

Так,

предположим

NAME=${USER_INPUT} 

и мы будем использовать $NAME в качестве параметра для поиска блока xml, который будет искать.

Как можно преобразовать общий XML-блок, подобный этому, в XML-файл, например:

 <block> <name>Bob</name> <address>USA</address> <email>bob@dogs.com</email> <phone>1234567</phone> </block> <block> <name>Peter</name> <food>France</address> <cell>peter@pizza.com</cell> <drinks>Coke</drinks> <car>Honda</car> <bike>Mountain bike</bike> </block> 

Поэтому я хочу достичь этого, чтобы получить блок xml, который удовлетворяет моему поиску,

например NAME=Bob ;

Результат скрипта должен быть в формате файла свойств

 name=Bob address=USA email=bob@dogs.com phone=1234567 

Здесь нужно учитывать, что формат xml для каждого блока отличается. Узлы не одинаковы для каждого блока xml.

Perl имеет отличный «режим абзаца» ( -00 ), где записи («строки») разделяются пустой строкой вместо одного символа \n . Используя это, вы можете легко извлечь соответствующие записи. Поэтому сначала убедитесь, что перед каждым <block> есть пустая строка, а затем используйте режим абзаца, чтобы найти то, что ищете:

 $ sed 's/<block>/\n<block>/' file | perl -00ne 'if(/<name>\s*bob\s*<\/name>/i){print}' <block> <name>Bob</name> <address>USA</address> <email>bob@dogs.com</email> <phone>1234567</phone> </block> 

Теперь оберните это в сценарий оболочки (используя здесь bash):

 #!/bin/ksh ## Read the search strings tag="$1" value="$2" target="file.xml" ## change this to whatever your xml file is called ## Search sed 's/<.\?block>/\n/' "$target" | perl -00ne "if(/<$tag>\s*$value\s*<\/$tag>/i){ ## May as well do the formatting in Perl as well s# *<([^/]+?)>#\1=#g; s/<\/.+?>//g; print }" 

Затем запустите сценарий, указав имя тега и требуемое значение в качестве входных данных:

 $ a.sh "name" "bob" name=Bob address=USA email=bob@dogs.com phone=1234567