#regex #xml #replace
#регулярное выражение #xml #заменить
Вопрос:
В файле XML я хочу заменить символ amp;
на amp;#x26;
в определенном элементе XML.
Вот структура каталогов и XML-файлов:
OrderImport
—-> 111
—-> 112
—-> 113
—-> 114
—-> 115
…
В одной папке находятся два XML-файла.
Вызывается один file_drupal.xml , вызывается второй файл fileRDE.xml .
Структура XML-файла file_drupal.xml:
<?xml version="1.0" encoding="utf-8"?>
<companys>
<company id="4356722" old_id="972214">
<producer>text amp; text continues</producer>
<date>
<createdDate>2019-06-28T13:09:25 00:00</createdDate>
<publishingDate>2012-07-13T00:00:00 00:00</publishingDate>
</date>
<workflow>published</workflow>
<text> Laboriosam, fermentum facilis magnam cras pede incididunt placerat rerum urna ut amp; eget justo atque? Distinctio? Ipsa sunt tempore? Necessitatibus saepe
duis repudiandae wisi reiciendis
</text>
</company>
</companys>
amp;
Символ должен быть заменен на amp;#x26;
в <producer>
элементе.
Глобальный в файле file_drupal.xml Я могу сделать это с помощью следующей команды:
find . -type f -name "file_drupal.xml" -exec ex -sc '%s/amp;/amp;#x26;/g' -cx {} ';'
Но я хочу заменить amp;
символ в файле file_drupal.xml только в <producer>
стихии.
amp;
Символ должен быть заменен во всей папке FolderImport, во всех file_drupal.xml файлы в нем.
Как я могу это решить?
Комментарии:
1. В общем случае регулярные выражения являются плохим инструментом для работы со структурированными форматами; но если ввод ограничен, он может работать. В частности, можете ли вы гарантировать, что
<producer>....</producer>
это всегда происходит все вместе в одной строке в каждом файле?2. Да, это так
3. Вы назвали это XML-файлом, но это не так. Это было бы менее запутанным для всех, включая вас, если бы вы назвали его файлом, отличным от XML. Дело в том, что существует множество инструментов для работы с файлами XML, но очень мало для работы с файлами, отличными от XML. И другой момент заключается в том, что вам нужно четко понимать в своих отношениях с тем, кто создает эту мерзость, что если они думают, что предоставляют вам XML, они ошибаются.
Ответ №1:
Если </producer>
конечный тег всегда встречается в той же строке, <producer>
что и начальный тег, попробуйте что-то вроде
perl -pe 's%(.*<producer>)(.*?)(</producer>.*)%
$a = $1; $b = $2; $c = $3; $b =~ s|amp;|amp;x26;|g; "$a$b$c"%ge' OrderImport/*/file_drupal.xml
-i~
Опция говорит о сохранении оригинала в file_drupal.xml~
качестве резервной копии. Возможно ~
, удалите его, как только вы будете уверены, что это работает правильно.
Демонстрация: https://ideone.com/mohRG5