У меня есть документ XML с текстом в значениях атрибута. Я не могу изменить способ создания XML-файла, но вам нужно извлечь значения атрибута без потери \ r \ n. Парсер XML, конечно же, вытесняет их.Заменить строки только в пределах регулярного выражения в perl
Так что я пытаюсь заменить \ r \ n в значениях атрибутов ссылками на сущности Я использую perl для этого, потому что это не-жадное соответствие. Но мне нужна помощь, чтобы замена произошла только в матче. Или мне нужно более простой способ сделать это :)
Вот то, что я до сих пор:
perl -i -pe 'BEGIN{undef $/;} s/m_description="(.*?)"/m_description="$1"/smg' tmp.xml
Это соответствует тому, что мне нужно работать: (. *). Но я не знаю, как развернуть этот шаблон, чтобы соответствовать ему внутри, и выполнять замену в результатах. Если бы я знал, сколько я мог бы сделать, но мне кажется, что мне нужно переменное количество групп захвата или что-то в этом роде? Для регулярного выражения много чего не понимаю, и кажется, что что-то нужно делать.
Пример:
preceding lines
stuff m_description="Over
any number
of lines" other stuff
more lines
должны пойти:
preceding lines
stuff m_description="Over any number of lines" other stuff
more lines
Решение
Благодаря Ikegam и ysth для решения я использовал, что для 5.14+ является:
perl -i -0777 -pe's/m_description="\K(.*?)(?=")/ $1 =~ s!\n! !gr =~ s!\r! !gr /sge' tmp.xml
показать образец данных? то, что вы показываете, не является XML – ysth
Вероятно, вы хотите что-то вроде 'perl -i -p0e '/ m_description =" \ K ([^ "] *)/$ 1 = ~ s% \ r \ n% % gr/ge'' ('-0' примерно совпадает с' BEGIN {undef $ /} '). – Dada
Думаю, вам нужна свернутая копия спецификации XML для prod. Почти как XML, но не совсем довольно грязный. Перла один лайнер будет трудно читать. Написание его как скрипта, в котором вы извлекаете и переформатировать описание, будет проще. – Sobrique