Ваше регулярное выражение корректно, но sed
не обрабатывает lookarounds. Ваш код хорошо работает с 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 функций; это найдено в других современных regexp реализациях, но не в sed.
Вам не нужен lookaround здесь. Положительный lookaround вначале или конец шаблона, который Вы заменяете, могут легко быть превращены в переменный текст замены. См. также Возврат только часть строки после шаблона соответствия для большего количества примеров и объяснений.
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>:
sed
сценарий: это используетperl
синтаксис вsed
, и я не знаюperl
. Благодаря разъясняются. спасибо – enzotib 10.11.2011, 11:14