Вставка текста между двумя шаблонами

У меня есть .xml файл, который содержит ниже

 <controller-host></controller-host> <controller-port></controller-port> <tier-name></tier-name> <node-name></node-name> 

Я хочу, чтобы этот вывод

 <controller-host>AppDynamicsHost</controller-host> <controller-port>80</controller-port> <tier-name>**the host name**</tier-name> <node-name>tomcat server</node-name> 

Я попытался использовать sed но не смог.

  • Получение подстрок между разделителями несколько раз из одной строки без цикла
  • Как изменить значения в файле XML
  • Как я действительно читаю XML-файл в человеческой форме, что имеет смысл?
  • Заменить значения из файла1 в файл2 awk
  • Скрипт для изменения файла конфигурации XML
  • конвертировать xml в csv
  • Удалить все узлы <FOLDER>! = Значение тега
  • Какой редактор можно использовать для выделения выделенных файлов проекта Mallard?
  • 3 Solutions collect form web for “Вставка текста между двумя шаблонами”

    Файл, который указан, недействителен xml. Вы должны добавить открывающие и закрывающие корневые теги. Как это:

     <xml> <controller-host></controller-host> <controller-port></controller-port> <tier-name></tier-name> <node-name></node-name> </xml> 

    С помощью этого ввода вы можете использовать XML-парсер, например xmlstartlet для редактирования содержимого:

     xmlstarlet ed -O -u //controller-host -v "AppDynamicsHost" \ -u //controller-port -v "80" \ -u //tier-name -v "the hostname" \ -u //node-name -v "tomcat server" file 
    • ed начать режим редактирования xmlstartlet
    • -O опустить объявление <?xml version="1.0"?>
    • -u обновить данный xpath
    • -v установить заданное значение

    Результатом будет:

     <xml> <controller-host>AppDynamicsHost</controller-host> <controller-port>80</controller-port> <tier-name>the hostname</tier-name> <node-name>tomcat server</node-name> </xml> 

    Чтобы отредактировать файл непосредственно на месте, вы можете использовать флаг -L .

    Вы можете попробовать что-то вроде этого:

     $host='hostname' sed -i 's/<controller-host><\/controller-host>/<controller-host>AppDynamicsHost<\/controller-host>/' yourfile.xml sed -i 's/<controller-port><\/controller-port>/<controller-port>80<\/controller-port>' yourfile.xml sed -i "s/<tier-name><\/tier-name>/<tier-name>${host}<\/tier-name>/' yourfile.xml sed -i 's/<node-name><\/node-name>/<node-name>tomcat server<\/node-name>/' yourfile.xml 

    Флаг -i означает запись результата в ваш файл, попробуйте запустить его без -i во время тестирования.

    Как сказал хаос, сделав файл действительным XML-файлом и используя xmlstarlet или аналогичный инструмент обработки XML (например, xsh ), это «правильный» ответ … но если вы просто хотите сделать простой шаблон, то вы должны изменить свой входной файл, чтобы иметь легко найти и заменить токены в местах, которые вы хотите изменить. Например:

     <controller-host>__CONTROLLER__</controller-host> <controller-port>__PORT__</controller-port> <tier-name>__HOSTNAME__</tier-name> <node-name>__NODENAME__</node-name> 

    Затем вы можете использовать любой из обычных инструментов (awk, sed, perl, ruby, whatever) для замены __CONTROLLER__ т. Д. С фактическими значениями, которые вы хотите, чтобы они имели.

    ПРИМЕЧАНИЕ. Очень важно использовать строки, которые иначе не встречаются в тексте, поэтому я использовал __ как часть __PORT__ строк, например __PORT__ а не только PORT .

    Это работает для очень простых шаблонов – если вам нужно сделать более сложные шаблоны, на многих языках есть очень сложные библиотеки шаблонов – например, perl имеет Text::Template (и многие другие – это общая проблема, которая вдохновила многих решений)

    Linux и Unix - лучшая ОС в мире.