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