Замена объект XML оценивает с положительным lookaround

Как насчет $(dirname "$0")/myfile?

1
10.11.2011, 10:01
3 ответа

Ваше регулярное выражение корректно, но 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.

3
27.01.2020, 23:21
  • 1
    Теперь я понимаю то, что было странным для меня в OP sed сценарий: это использует perl синтаксис в sed, и я не знаю perl. Благодаря разъясняются. спасибо –  enzotib 10.11.2011, 11:14
  • 2
    ! Вы поняли то, что я пытался сделать :) Это ТОЧНО, что я имел в виду! –  Naftuli Kay 10.11.2011, 11:27

Вы пытаетесь использовать синтаксис регулярного выражения 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>:'
1
27.01.2020, 23:21

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

s:<\([^>]\+\)>default</\1>:<\1>super</\1>:
0
27.01.2020, 23:21

Теги

Похожие вопросы