Вопрос или проблема
Я использую следующую комбинацию команд, чтобы вывести значение из 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"
Решение проблемы
- Удаление лишнего переноса строки: Вы можете удалить последний перенос строки с помощью
tr
:
grep -Po '<add key="WorkstationID" value="\K[^"]+' web.config.txt | tr -d '\n' | awk '{print "MapOPIWs = \04200000" $0 "\""}' >> fipayeps_def.cfg
- Использование переменной: Записав результат команды
grep
в переменную, вы автоматически избавитесь от лишнего переноса строки:
var=$(grep -Po '<add key="WorkstationID" value="\K[^"]+' web.config.txt)
echo "MapOPIWs = \"00000$var\"" >> fipayeps_def.cfg
- Применение 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-файлами. Если у вас есть дополнительные вопросы или требуется помощь, пожалуйста, обращайтесь.