Как напечатать значение между ” ” из 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-файла и записи их в другой файл без лишних пробелов и переводов строки, существует несколько подходов, которые можно реализовать в зависимости от предпочтений и доступных инструментов.

Проблема: Извлечение из XML с ненужным переносом строки

Вы упоминали, что используете командную строку для извлечения значения "WorkstationID" из 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 ... | tr -d '\n' >> fipayeps_def.cfg
  2. Использование переменной, что автоматически уберет лишний перевод строки:

    var=$(grep -Po '<add key="WorkstationID" value="\K[^"]+' web.config.txt)
    echo "MapOPIWs = \"$var\"" >> fipayeps_def.cfg
  3. Применение XMLStarlet для более четкой обработки XML:
    XMLStarlet — это специализированный инструмент для работы с XML, который куда лучше подходит для вашего случая.

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

Альтернатива: Использование Perl

Perl также предоставляет возможности работы с текстовыми данными:

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

Рекомендации и вывод

Использование правильных инструментов и подходов позволит вам избегать типичных ошибок, связанных с обработкой XML. XMLStarlet и Perl являются надежными способами избежать эксплуатации выражений, которые могут ошибочно обработать данные.

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

Надеюсь, данные советы помогут вам достичь желаемого результата и оптимизировать вашу работу с XML.

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

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