Intereting Posts
Контур Loop в текстовых файлах Завершение Bash не будет работать, если вы вызываете приложение с абсолютным путем Debian checkinstall игнорирует install = no; как его построить, но НЕ автоинсталлировать пакет? Ядро Linux IPv6 поиск маршрута – как он работает? sshfs всегда запрашивает пароль в fstab? Откуда идет вывод приложения из диспетчера окон? ulimit: разница между жесткими и мягкими пределами Правило iptables для вывода порта и ip на экземпляр AWS Легкий и легкий в установке TCP-потоки, сосуществующие с UDP при использовании SFQ (стохастическая честная очередь) Как мне (заново) создать / создать / собрать массив IMSM RAID-0 из образа диска вместо дисков с помощью mdadm? Запустить две установки Grub2 Cinnamon разбился после установки драйверов nvidia ArchLinux | Пароль входа не работает после создания новой учетной записи пользователя Список * все * IP-маршруты к месту назначения в таблице маршрутизации Linux

Замена значений сущности XML положительным обратным знаком

Я пытаюсь сделать несколько простых файлов:

 sed 's:(?<=<Type>)default(?=</Type>):super:' < myfile.xml 

Концепция довольно проста, используя положительный lookaround, найти теги и заменить содержимое «супер». К сожалению, он не работает, ничего не заменяется. Что я делаю не так?

Я хочу «изменить» файл, похожий на этот:

 <Hello> <World> <Type>default</Type> </World> </Hello> по <Hello> <World> <Type>default</Type> </World> </Hello> 

так что это выглядит так:

 <Hello> <World> <Type>super</Type> </World> </Hello> 

Ваше регулярное выражение верное, но sed не обрабатывает образы. Ваш код отлично работает с perl :

 perl -pe 's:(?<=<Type>)default(?=</Type>):super:' your.file 

Поскольку регулярные выражения, как правило, не очень хороши в обработке XML, я предлагаю попробовать XMLStarlet :

 xml ed -O -u '//Type' -v 'super' your.file 

И perl и xml могут редактировать на месте, поэтому не добавляет никакой боли, заменяющей sed .

Вы пытаетесь использовать синтаксис регулярных выражений Perl в sed; это не сработает. Sed использует основные регулярные выражения ; Perl использует расширенные регулярные выражения с большим количеством функций . Lookaround – одна из особенностей Perl; он встречается в других современных реализациях регулярных выражений, но не в sed.

Здесь вам не нужно смотреть. Положительный поиск в начале или конце шаблона, который вы заменяете, можно легко превратить в переменный текст замены. См. Также Вернуть только часть строки после соответствующего шаблона для получения дополнительных примеров и объяснений.

 sed 's:\(<Type>\)default\(</Type>\):\1super\2:' 

Здесь, поскольку внешний вид и внешний вид являются постоянными, вы могли бы просто выполнить замену строки.

 sed 's:<Type>default</Type>:<Type>super</Type>:' 

Я не совсем понимаю, какие части ввода являются переменными и постоянными. Предположим, что Type является переменным и default , super являются константами, вы можете использовать следующий сценарий sed

 s:<\([^>]\+\)>default</\1>:<\1>super</\1>: