Perl匹配多行字符串并替换
我有一个位于远程主机中的文件。我想将该文件中的字符串Perl匹配多行字符串并替换,perl,Perl,我有一个位于远程主机中的文件。我想将该文件中的字符串cronExpression value=“*30 9?*MON-FRI”替换为cronExpression value=“*$hour$min?*MON-FRI” 输入文件为:test.properties 其内容如下: <bean id="DisconnectCronTrigger" class="org.springframework.scheduling.quartz.CronFactoryBean"> <proper
cronExpression value=“*30 9?*MON-FRI”
替换为cronExpression value=“*$hour$min?*MON-FRI”
输入文件为:test.properties
其内容如下:
<bean id="DisconnectCronTrigger"
class="org.springframework.scheduling.quartz.CronFactoryBean">
<property name="jobDetail" ref="delayDisconnectJobDetail" />
<property name="cronExpression" value="* 30 20 ? * MON-FRI" />
</bean>
<bean id="retryJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="retryMeterCommandJob" />
<property name="targetMethod" value="executeAll" />
</bean>
<bean id="retryCronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="retryJobDetail" />
<property name="cronExpression" value="* 30 9 ? * MON-FRI" />
</bean>
我尝试了下面提到的代码,但未能替换
%opts =(user => 'xxxxx',
password => '1234444');
my $ssh = Net::OpenSSH->new("$host", %opts);
$ssh->error and die "Can't ssh to $host: " . $ssh->error;
$pathFolder="perl -pi -e 'sm/\<property name=\"jobDetail\" ref=\"delayDisconnectJobDetail\" \/\>.*?
\<property name=\"cronExpression\" value=\"\* 30 20 \? \* MON\-FRI\" /\<property name=\"jobDetail\" ref=\"delayDisconnectJobDetail\" \/\>.*?
\<property name=\"cronExpression\" value=\"\* **40 10** \? \* MON\-FRI\"/gsm' /test.properties";
$ssh->system("$pathFolder") or die "remote command failed: " . $ssh->error;
<property name="targetMethod" value="executeAll" />
</bean>
<bean id="retryCronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="retryJobDetail" />
<property name="cronExpression" value="* 30 9 ? * MON-FRI" />
</bean>
%opts=(用户=>'xxxxx',
密码=>“1234444”);
我的$ssh=Net::OpenSSH->new($host),%opts);
$ssh->error and die“无法ssh到$host:”$ssh->错误;
$pathFolder=“perl-pi-e”sm/\.*?
\ Perl中没有sm///
。iss///
和ism///
。这可能会导致语法错误。当您已经有Perl时,通过命令行执行此操作也有点奇怪
您可以节省使用XML解析器,即使它未安装在远程主机中。请看一看,它允许您通过SSH在远程计算机上运行Perl代码,甚至使用本地计算机上的Perl模块。Perl中没有sm////
。iss//
和ism/
。这可能给了您一个语法当您已经有了Perl时,通过命令行执行此操作有点奇怪
您可以节省使用XML解析器,即使它未安装在远程主机中。请看一看,它允许您通过SSH在远程计算机上运行Perl代码,甚至使用本地计算机上的Perl模块。您可以让Net::OpenSSH为您进行shell引用,并解决您的一个问题。不过,在任何情况下,使用常规处理XML的表达式通常不是一个好主意,因为XML文件中的任何微小更改都可能破坏脚本
由于您的文件似乎不太大,只需使用scp
将其复制到本地计算机,然后使用适当的XML处理模块在本地执行任何所需的处理,最后将其复制回远程计算机:
use Net::OpenSSH;
use XML::LibXML;
my $hour = '...';
my $min = '...';
my $ssh = Net::OpenSSH->new($host,
user => 'xxxxx',
password => '1234444');
$ssh->error and die "Can't ssh to $host: " . $ssh->error;
$ssh->system(cp => '/test.properties', '/test.properties.bak'); # backup
$ssh->scp_get("/test.properties");
my $dom = XML::LibXML->load_xml(location => 'test.properties');
for my $ele ($dom->findnodes('/config/bean[property[@name="jobDetail" and
@ref="delayDisconnectJobDetail"]]
/property[@name="cronExpression"]')) {
$ele->setAttribute(value => "* $hour $min ? * MON-FRI");
}
open my $out, '>', 'test.properties.new';
binmode $out;
$dom->toFH($out);
$ssh->scp_put('test.properties.new', '/test.properties');
您可以让Net::OpenSSH为您进行shell引用,并解决您的一个问题。不过,在任何情况下,使用正则表达式处理XML通常都不是一个好主意,因为XML文件中的任何微小更改都可能破坏您的脚本
由于您的文件似乎不太大,只需使用scp
将其复制到本地计算机,然后使用适当的XML处理模块在本地执行任何所需的处理,最后将其复制回远程计算机:
use Net::OpenSSH;
use XML::LibXML;
my $hour = '...';
my $min = '...';
my $ssh = Net::OpenSSH->new($host,
user => 'xxxxx',
password => '1234444');
$ssh->error and die "Can't ssh to $host: " . $ssh->error;
$ssh->system(cp => '/test.properties', '/test.properties.bak'); # backup
$ssh->scp_get("/test.properties");
my $dom = XML::LibXML->load_xml(location => 'test.properties');
for my $ele ($dom->findnodes('/config/bean[property[@name="jobDetail" and
@ref="delayDisconnectJobDetail"]]
/property[@name="cronExpression"]')) {
$ele->setAttribute(value => "* $hour $min ? * MON-FRI");
}
open my $out, '>', 'test.properties.new';
binmode $out;
$dom->toFH($out);
$ssh->scp_put('test.properties.new', '/test.properties');