У меня есть файл Oracle WebLogic config.xml, читаемый в строку. Я хочу обновить в нем серию строк. Я подтвердил, что читаю файл, устанавливаю строки и могу обновить правильную строку с параметрами, которые я ищу, но я не могу обновить исходную строку.

Вот основной цикл:

while ( $lines =~ m{(<arguments>.*?</arguments>)}mgs ) {

    my $nchunk = my $ochunk = $1;

    print "#" . '=' x 70 . "\n";

    my ($ms)  = $ochunk =~ m{.*/(.*?)\.out.*};
    my $nname = $monster->{$domain}->{$ms}->{nodeName};
    my $tname = $monster->{$domain}->{$ms}->{tierName};

    my $newentry = sprintf(" %s %s.nodeName=-Dappdynamics.agent.nodeName=%s",
            $appdjar, $ms, $nname);
    $newentry .= " $ms.appdynamics.tierName=-Dappdynamics.tierName=$tname";

    $nchunk =~ s/(<\/arguments>)/$newentry\1/g;

    print "$ochunk\n";
    print "#" . '-' x 70 . "\n";
    print "$nchunk\n";

    # $lines =~ s!$ochunk!!msg;
    # $lines =~ s!$ochunk!$nchunk!msg;
}

Как написано, это приводит к:

#======================================================================
<arguments>-Xms512m -Xmx512m -Dweblogic.system.BootIdentityFile=/opt/app/oracle/user_projects/domains/AccountingServices_Domain/boot.properties -Dweblogic.Stdout=/opt/app/oracle/user_projects/logs/AccountingServices_Domain/AccountingCommon_MS1.out -XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=/opt/app/oracle/user_projects/logs/AccountingServices_Domain/dumps  -XX:+UnlockCommercialFeatures  -XX:+FlightRecorder  -Dcom.sun.management.jmxremote.port=40124  -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false  -XX:+UnlockCommercialFeatures -XX:+FlightRecorder  -XX:FlightRecorderOptions=defaultrecording=true,disk=true,repository=/opt/app/oracle/user_projects/logs/AccountingServices_Domain,maxage=10m,dumponexit=true,dumponexitpath=/opt/app/oracle/user_projects/logs/AccountingServices_Domain  -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -Dlog4j.configuration=file:/opt/app/oracle/user_projects/applications/AccountingServices_Domain/log4j.xml</arguments>
#----------------------------------------------------------------------
<arguments>-Xms512m -Xmx512m -Dweblogic.system.BootIdentityFile=/opt/app/oracle/user_projects/domains/AccountingServices_Domain/boot.properties -Dweblogic.Stdout=/opt/app/oracle/user_projects/logs/AccountingServices_Domain/AccountingCommon_MS1.out -XX:+HeapDumpOnOutOfMemoryError  -XX:HeapDumpPath=/opt/app/oracle/user_projects/logs/AccountingServices_Domain/dumps  -XX:+UnlockCommercialFeatures  -XX:+FlightRecorder  -Dcom.sun.management.jmxremote.port=40124  -Dcom.sun.management.jmxremote.ssl=false  -Dcom.sun.management.jmxremote.authenticate=false  -XX:+UnlockCommercialFeatures -XX:+FlightRecorder  -XX:FlightRecorderOptions=defaultrecording=true,disk=true,repository=/opt/app/oracle/user_projects/logs/AccountingServices_Domain,maxage=10m,dumponexit=true,dumponexitpath=/opt/app/oracle/user_projects/logs/AccountingServices_Domain  -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -Dlog4j.configuration=file:/opt/app/oracle/user_projects/applications/AccountingServices_Domain/log4j.xml -javaagent:/opt/app/appdynamics/universal-agent/monitor/java/javaagent.jar AccountingCommon_MS1.nodeName=-Dappdynamics.agent.nodeName=AccountingCommon_2123 AccountingCommon_MS1.appdynamics.tierName=-Dappdynamics.tierName=AccountingCommon</arguments>
[[snip]]

Кажется, я не могу «заново найти» исходный фрагмент, как указано в одной из прокомментированных строк $, пытающихся заменить $ochunk ничем.

-1
dkoleary 20 Май 2018 в 20:22

1 ответ

Лучший ответ

Вы делаете это очень окольным путем, поэтому я не мог понять, что вы пытались сделать в течение долгого времени. Что вы на самом деле пытаетесь сделать, так это

Вставить дополнительную строку после существующего текста в элементе arguments

И нужна просто подмена. Я оставил его глобальным на случай, если в XML действительно есть несколько таких элементов. Мне не удалось его протестировать, но я знаю, что он компилируется

$lines =~ s{ (<arguments>) (.*?) (</arguments>) }{

    my ($otag, $text, $ctag)  = ($1, $2, $3);
    my ($ms)   = $text =~ m{.*/(.*?)\.out};

    my $msdata = $monster->{$domain}{$ms};
    my $node   = $msdata->{nodeName};
    my $tier   = $msdata->{tierName};

    my $newentry = " $appdjar $ms.nodeName=-Dappdynamics.agent.nodeName=$node";
    $newentry   .= " $ms.appdynamics.tierName=-Dappdynamics.tierName=$tier";

    $otag . $text . $newentry . $ctag;
}segx
1
Borodin 21 Май 2018 в 18:26