Как извлечь конкретный текст из уже извлеченного XML-текста в bash-скрипте - PullRequest
1 голос
/ 20 февраля 2011

Мне удалось извлечь значение из файла XML:

<--more labels up this line>
<ExtraDataItem name="GUI/LastVMSelected" value="14cd3204-4774-46b8-be89-cc834efcba89"/>
<--more labels and text down this line-->

, используя это:

  UUID=$(sed -ne '/name="GUI\/LastVMSelected"/s/.*value="\([^"]*\)".*/\1/p' inputfile.xml)
       echo $UUID

У меня есть этот результат в консоли:

14cd3204-4774-46b8-be89-cc834efcba89

Вот и все!Но теперь мне нужно использовать этот UUID, чтобы перейти к другой части того же XML-файла, который я раньше не показывал.Я упростил XML-файл, чтобы показать наиболее релевантные метки:

      <--more labels up this line>
 <ExtraDataItem name="GUI/LastVMSelected" value="14cd3204-4774-46b8-be89-cc834efcba89"/>
      <--more labels and text down this line-->
      <MachineEntry uuid="{14cd3204-4774-46b8-be89-cc834efcba89}" src="Machines/SomeMachine/SomeMachine.xml"/>
 <--more labels and text down this line-->

Мне нужно получить «SomeMachine» без расширения, только это имя.Я попытался сам добавить несколько строк:

UUID=$(sed -ne '/name="GUI\/LastVMSelected"/s/.*value="\([^"]*\)".*/\1/p' inputfile.xml)    
LastVMname=$(sed -ne '/MachineEntry uuid="{'$UUID'}"/s/.*src="Machines\([^"]*\).xml".*/\1/p' inputfile.xml)
    echo $LastVMname

Но я получаю такой вывод:

/SomeMachine/SomeMachine

, и я не знаю, как избавиться от / SomeMachine / SomeMachine, просто нужно "SomeMachine».Документация Sed довольно запутанная: S

1 Ответ

2 голосов
/ 20 февраля 2011

Вы можете использовать альтернативный разделитель для команды замены и ввести косую черту в данных.

LastVMname=$(sed -ne '/MachineEntry uuid="{'$UUID'}"/s|.*src="Machines.*/\(.*\).xml".*|\1|p' inputfile.xml)

Однако, таким образом, безумие лжет .

Вы должны использовать синтаксический анализатор XML, такой как xmlstarlet. Что-то вроде:

uuid=$(xmlstarlet sel -t -m "//ExtraDataItem[@name='GUI/LastVMSelected']" -v @value)
LastVMname=$(xmlstarlet sel -t -m "//MachineEntry[uuid='$uuid'] -v @src)
LastVMname=${LastVMname##*/}    # strip up to and including the last slash
LastVMname=${LastVMname%.*}     # strip the extension
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...