替换多行字符串中的行
Replace lines in a multi-line string
我将一个 Oracle WebLogic config.xml
文件读入一个字符串。我正在寻找更新其中的一系列行。我已经确认我正在读取文件、设置行并能够使用我正在寻找的参数更新正确的行,但我似乎无法更新原始字符串。
这是主循环:
while ( $lines =~ m{(<arguments>.*?</arguments>)}mgs ) {
my $nchunk = my $ochunk = ;
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/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]]
我似乎无法 're-find' 源代码块,正如其中一条评论的 $lines 试图用任何东西替换 $ochunk
所指示的那样。
你用一种非常迂回的方式来解决这个问题,这就是为什么我花了很长时间无法理解你试图做的事情。你实际上想做的是
Insert an additional string after the existing text in an arguments
element
你只需要一个替代品。我将其保留为全局,以防 XML 中确实存在多个此类元素。我无法测试它,但我知道它可以编译
$lines =~ s{ (<arguments>) (.*?) (</arguments>) }{
my ($otag, $text, $ctag) = (, , );
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
我将一个 Oracle WebLogic config.xml
文件读入一个字符串。我正在寻找更新其中的一系列行。我已经确认我正在读取文件、设置行并能够使用我正在寻找的参数更新正确的行,但我似乎无法更新原始字符串。
这是主循环:
while ( $lines =~ m{(<arguments>.*?</arguments>)}mgs ) {
my $nchunk = my $ochunk = ;
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/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]]
我似乎无法 're-find' 源代码块,正如其中一条评论的 $lines 试图用任何东西替换 $ochunk
所指示的那样。
你用一种非常迂回的方式来解决这个问题,这就是为什么我花了很长时间无法理解你试图做的事情。你实际上想做的是
Insert an additional string after the existing text in an
arguments
element
你只需要一个替代品。我将其保留为全局,以防 XML 中确实存在多个此类元素。我无法测试它,但我知道它可以编译
$lines =~ s{ (<arguments>) (.*?) (</arguments>) }{
my ($otag, $text, $ctag) = (, , );
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