Intereting Posts
Периодически перезапускать службу systemd Почему моя среда полна ␀s? Как запустить ядро ​​linux usermode? Сохранять новые строки в выводе разреза Как разрешить группе читать или редактировать файлы без права на archlinux? При удалении пакета Debian, как я могу удалить файлы Python * .pyc? Увеличьте количество линий, прокручиваемых клещей колесика мыши, везде Установка FreeRADIUS – библиотека talloc не найдена Обновление ядра linux с 3 по 4 в Debian 8 Как заменить \ 1 \ на новую строку Как декомпонировать окно с помощью xprop Как распечатать все записи в файле 1, но обратите внимание на записи, которые не соответствуют файлу2? Найти файлы, чьи базовые имена одинаковы, но имена их не являются Как аутентифицировать пользователя с помощью PAM, который не является пользователем, который запустил приложение Как включить службу только в том случае, если она установлена ​​в Puppet?

Как заменить «&» на «& amp;», за исключением того, что уже является частью XML-объекта?

У меня есть файл (xml) со многими &/</>/etc , но иногда также и некоторые символы. Я хочу изменить этот символ на & без замены других.

 cat file.xml | sed s/"&"/"&"/g | sed s/"&"/"&"/g > new_file.xml 

Это не работает, потому что оно также заменяет & s, найденное в & , > например.

Как это сделать?

Сначала вы можете избежать & найденных в сущности, а затем заменить остальные. Подобно:

 LC_ALL=C sed 's/_/_u/g; # use _ as an escape character. Here escape itself s/&\([[:alpha:]][[:alnum:]]*;\)/_a\1/g; # replace & with _a when in entities s/&\(#[0-9]\{1,8\};\)/_a\1/g; # Ӓ case s/&\(#x[0-9a-fA-F]\{1,8\};\)/_a\1/g; # ꯍ case s/&/\&/g; # now convert the non-escaped &s s/_a/\&/g;s/_u/_/g; # restore escaped & and _' - LC_ALL=C sed 's/_/_u/g; # use _ as an escape character. Here escape itself s/&\([[:alpha:]][[:alnum:]]*;\)/_a\1/g; # replace & with _a when in entities s/&\(#[0-9]\{1,8\};\)/_a\1/g; # Ӓ case s/&\(#x[0-9a-fA-F]\{1,8\};\)/_a\1/g; # ꯍ case s/&/\&/g; # now convert the non-escaped &s s/_a/\&/g;s/_u/_/g; # restore escaped & and _' , LC_ALL=C sed 's/_/_u/g; # use _ as an escape character. Here escape itself s/&\([[:alpha:]][[:alnum:]]*;\)/_a\1/g; # replace & with _a when in entities s/&\(#[0-9]\{1,8\};\)/_a\1/g; # Ӓ case s/&\(#x[0-9a-fA-F]\{1,8\};\)/_a\1/g; # ꯍ case s/&/\&/g; # now convert the non-escaped &s s/_a/\&/g;s/_u/_/g; # restore escaped & and _' 

С perl :

 perl -pe 's/&(?!#?\w{1,31};)/&/g' 

Это немного более слабо, чем sed поскольку он будет рассматривать в качестве объекта XML что-нибудь, что начинается с & , необязательным # и любым числом (до 31) alnums (или подчеркиванием) и ; , в то время как sed будет более явным в том, что сущность (как в &#blah; не будет рассматриваться как сущность). На практике это вряд ли может иметь большое значение.