Как напечатать значение между ” ” из XML файла?

Вопрос или проблема

Я использую следующую комбинацию команд, чтобы вывести значение из XML-файла в другой файл:

grep -Po '<add key="WorkstationID" value="\K[^"]+' web.config.txt | awk '{print "MapOPIWs = \04200000" $0}' >> fipayeps_def.cfg && echo '"' >> fipayeps_def.cfg

но у меня возникает проблема с новой строкой:

cat fipayeps_def.cfg

    MapOPIWs = "000001769
    "

хотя желаемый результат должен быть:

    MapOPIWs = "000001769"

Есть идеи, как это исправить?

Удалите завершающий перевод строки:

grep ... | tr -d '\n' >> cfg

Или, чтобы сделать это более читаемым, сохраните вывод в переменной, что автоматически удаляет завершающий перевод строки:

var=$(grep ...)
echo "MapOPIWs = \"$var\"" >> fipayeps_def.cfg

Также используйте настоящий XML парсер:

xmlstarlet sel -t -v '//add[@key="WorkstationID"]/@value' < web.config.txt
var=$(xmlstarlet sel...)
echo "MapOPIWs = \"$var\"" >> fipayeps_def.cfg

Я бы также рекомендовал XMLStarlet для XML, как в этом ответе, так как обычно вы не хотите использовать регулярные выражения для XML-подобных синтаксисов, но если вы предпочитаете их для подобных задач, perl делает лучшее форматирование, чем grep:

perl -ne 'print "MapOPIWs = \"$1\"" while /<add key="WorkstationID" value="([^"]+)/g' web.config.txt >> fipayeps_def.cfg

Вы можете использовать захватывающую группу и затем вывести её с помощью $1 и т.д.

Ответ или решение

Если вы хотите извлечь значение из XML-файла, расположенного между кавычками, и вы столкнулись с проблемой лишнего переноса строки при использовании команды grep, я рекомендую решить эту задачу более надежным и профессиональным способом, чем использовать регулярные выражения.

Описание проблемы

Вы используете следующую команду для извлечения и форматирования данных из XML:

grep -Po '<add key="WorkstationID" value="\K[^"]+' web.config.txt | awk '{print "MapOPIWs = \04200000" $0}' >> fipayeps_def.cfg && echo '"' >> fipayeps_def.cfg

Эта команда добавляет лишний перенос строки к значению:

MapOPIWs = "000001769
"

Ожидаемый результат

Конечный результат должен выглядеть следующим образом:

MapOPIWs = "000001769"

Решение проблемы

  1. Удаление лишнего переноса строки: Вы можете удалить последний перенос строки с помощью tr:
grep -Po '<add key="WorkstationID" value="\K[^"]+' web.config.txt | tr -d '\n' | awk '{print "MapOPIWs = \04200000" $0 "\""}' >> fipayeps_def.cfg
  1. Использование переменной: Записав результат команды grep в переменную, вы автоматически избавитесь от лишнего переноса строки:
var=$(grep -Po '<add key="WorkstationID" value="\K[^"]+' web.config.txt)
echo "MapOPIWs = \"00000$var\"" >> fipayeps_def.cfg
  1. Применение XML-парсера: Более корректный способ работы с XML — это использование XML-парсера, например, XMLStarlet. Это особенно важно для работы с XML, так как регулярные выражения плохо справляются с вложенными и сложными структурами:
var=$(xmlstarlet sel -t -v '//add[@key="WorkstationID"]/@value' web.config.txt)
echo "MapOPIWs = \"$var\"" >> fipayeps_def.cfg

Рекомендуемые действия

Профессиональная работа с XML подразумевает использование специализированных инструментов, таких как XMLStarlet, который обеспечивает точное извлечение данных без проблем, связанных с форматированием. Это повысит вашу продуктивность и снизит вероятность ошибок при обработке XML.

Надеюсь, эти решения помогут вам достичь желаемого результата и улучшат ваш рабочий процесс с XML-файлами. Если у вас есть дополнительные вопросы или требуется помощь, пожалуйста, обращайтесь.

Оцените материал
Добавить комментарий

Капча загружается...