Заменить текст и сделать отступ с помощью sed - PullRequest
1 голос
/ 21 мая 2019

У меня есть простой XML-файл, похожий на:

<student>
</student>

Я использую эту команду sed:

    sed -i "s/<\/student>/  <name>${1}<\/name>\
      <age>${2}<\/age>\
<\/student>/g" pom.xml

, чтобы заменить мой XML некоторыми данными XML с помощью команды:

. / Main.sh JohnDoe 12

и на основе значений командной строки он должен печататься как

<student>
  <name>JohnDoe</name>
  <age>12</age>
</student>

, но заканчивается печатью как

   <student>
     <name>JohnDoe</name>  <age>12</age>  </student>

Так как же мне аккуратно отформатировать мои xml-данные, используя sed !!

Заранее спасибо за помощь !!

Ответы [ 3 ]

1 голос
/ 21 мая 2019
sed -i "s/<\/student>/  <name>${1}<\/name>\n  <age>${2}<\/age>\n<\/student>/g" pom.xml

Имейте в виду, что синтаксический анализ XML с помощью sed или awk не рекомендуется, ищите здесь parse xml bash

0 голосов
/ 23 мая 2019

После работы над этой проблемой в течение нескольких дней!Мне удалось придумать решение

#!/bin/bash

newLine=\\n

sed -i "s/<\/student>/  <name>${1}<\/name>${newLine}\
  <age>${2}<\/age>${newLine}\
<\/student>/g" pom.xml

, создать новую строку \n Переменная и добавить ее в конце каждой строки ...

0 голосов
/ 21 мая 2019

XML - это язык разметки со своей семантикой, и его не следует анализировать / манипулировать такими инструментами, как sed.Используйте соответствующие анализаторы / процессоры XML / HTML.

С помощью инструмента xmlstarlet:

образец test.xml содержимое:

<student>
</student>

test.sh содержание скрипта:

#!/bin/bash

xmlstarlet ed -s "student" -t elem -n name -v "$1" -s "student" \
           -t elem -n age -v "$2" test.xml | xmlstarlet fo -o -

Использование:

$ . test.sh John 35

Вывод:

<student>
  <name>John</name>
  <age>35</age>
</student>

Ссылка на документацию: http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html#idm47077139594320

...