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

У меня есть .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-файла
  • Как создать XML-документ из grep-вывода
  • команда sed - Заменить строку в файле
  • Найти шаблон в XML с помощью команды unix
  • VIM переходит от одного тега xml к закрытию
  • Скрипт для изменения файла конфигурации XML
  • Как получить список значений соответствия атрибутов с помощью xmllint и xpath?
  • Как разобрать XML в CSV с помощью сценария оболочки?
  • 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 - лучшая ОС в мире.