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

У меня есть .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 но не смог.

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 (и многие другие – это общая проблема, которая вдохновила многих решений)

  • Как создать XML-документ из grep-вывода
  • Как разбить Openbox `rc.xml` на несколько файлов?
  • Разделить XML-файл на несколько файлов
  • Преобразование / импорт плоского файла с несколькими записями, по одной переменной на строку
  • конвертировать xml в csv
  • извлекать блоки текста из xml-файла с условием
  • строки в столбцы с awk
  • Удалить тег и содержимое на основе дочернего тега и добавить новый контент - Shellscript xml
  • Получение подстрок между разделителями несколько раз из одной строки без цикла
  • изменить строку и удалить тег, используя perl из xml-файла?
  • Как добавить строку из списка в другой файл, когда указанная строка найдена?
  • конвертировать CDA XML в PDF без * TeX?
  • Interesting Posts

    Место Grub – это было сделано в mbr или в другом месте?

    Как узнать, является ли текстовый файл подмножеством другого

    Правило перенаправления для Apache: добавление www в URL

    В Linux я бы использовал «/ opt» для пользовательского программного обеспечения. В FreeBSD?

    Подавать весь трафик через OpenVPN только для определенного сетевого пространства имен

    su: Пользователь не известен базовому модулю аутентификации

    Firefox кажется полностью загруженным, но окно браузера не отображается в течение нескольких минут

    Создайте новое терминальное окно с терминала

    Почему после перехода я могу синхронизировать работу, но не после cp -r *?

    Не удалось открыть загрузочный файл в MySQL

    Установка Avahi на FreeBSD – Daemon не запускается

    Как передать параметры псевдониму?

    Сканирование no: символов файла и запись его самого файла

    Не удалось сделать бесплатный доступ к удаленному компьютеру!

    Как автоматизировать настройку рабочего стола при запуске?

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