Замена регулярного выражения в Perl, если замена числовая - PullRequest
0 голосов
/ 19 октября 2018

Это, наверное, что-то действительно глупое, и я прошу прощения, если это так.Я не знаю точно, что искать, и мне не повезло с поисками, которые я провел за последние полчаса или около того.В любом случае ...

Итак, я хочу автоматизировать внесение простого изменения в xml с помощью perl как части процесса сборки.Это изменение, которое я делаю, оно является частью файла конфигурации с именем mapred-site.xml

<property>
  <name>yarn.app.mapreduce.am.resource.mb</name>
-    <value>1024</value>
+    <value>4096</value>
</property>

У меня есть замена регулярного выражения Perl, которая делает именно то, что мне нужно, пока я не изменю этоFOO до 4096

cat mapred-site.xml | perl -p0e "s/(yarn.app.mapreduce.am.resource.mb<\/name>\s*?<value>)....(<\/value>)/\\1FOO\\2/s"

Догадываясь, что проблема в том, что рядом с \\1 имеются цифры, относящиеся к первой части, и он вытягивает их и пытается выполнить \\14096или подобное, но я не смог придумать решение.

Я извиняюсь, если сама команда небрежна / неэффективна, я все еще только начинаю с этими командами.

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Вот менее хрупкий / более понятный способ сделать это, используя Mojo :: DOM :

cat mapred-site.xml | perl -CSD -0777 -MMojo::DOM -pe '$_ = Mojo::DOM->new->xml(1)->parse($_); $_->find("property > name")->first(sub { $_->text eq "yarn.app.mapreduce.am.resource.mb" })->following("value")->first->content(4096)'

В качестве более читабельного сценария:

use strict;
use warnings;
use Mojo::DOM;
use open ':std', ':encoding(UTF-8)';

my $dom = do { local $/; Mojo::DOM->new->xml(1)->parse(readline \*STDIN) };

my $name = $dom->find('property > name')
  ->first(sub { $_->text eq 'yarn.app.mapreduce.am.resource.mb' });
$name->following('value')->first->content(4096);

print $dom->to_string;
0 голосов
/ 19 октября 2018

Использование \1, \2 и т. Д. В правой части регулярного выражения в любом случае составляет около миллиона лет;рекомендуемый способ - использовать $1, $2 и т. д. А если вы используете их, вы можете использовать фигурные скобки, чтобы отделить имя переменной от любого соседнего элемента, например, ${1}FOO${2} (или, точно так же, ${1}4096${2})..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...