我是Perl正则表达式的初学者。我正在从一个文本文档中读取内容,并试图提取与所需字符串完全匹配的行,该字符串包含空格和特殊字符,即"hwsapbc05pvz ps -ef |grep prd | grep -v grep | wc -l“。下面是文本文档中的内容
spawn ssh -t -q -o StrictHostKeyChecking=no hwldbbc01pvs ps -ef |grep mysqld | grep -v grep | wc -l
spawn ssh -t -q -o StrictHostKeyChecking=no hwsapbc01pvb ps -ef |grep prd | grep -v grep | wc -l
spawn ssh -t -q -o StrictHostKeyChecking=no hwsapbc02pvc ps -ef |grep prd | grep -v grep | wc -l
spawn ssh -t -q -o StrictHostKeyChecking=no hwsapbc03pvg ps -ef |grep prd | grep -v grep | wc -l
spawn ssh -t -q -o StrictHostKeyChecking=no hwsapbc04pvv ps -ef |grep prd | grep -v grep | wc -l
spawn ssh -t -q -o StrictHostKeyChecking=no hwsapbc05pvz ps -ef |grep prd | grep -v grep | wc -l
spawn ssh -t -q -o StrictHostKeyChecking=no hwadbgw31pvv ps -ef |grep OpenDeploy | grep -v grep | wc -l
spawn ssh -t -q -o StrictHostKeyChecking=no hwadbgw32pve ps -ef |grep OpenDeploy | grep -v grep | wc -l
spawn ssh -t -q -o StrictHostKeyChecking=no hwawbgw01pvy ps -ef |grep sayt.*4150 | grep -v grep | wc -l我已经写好了代码
my $infile = "InputTextDoc.txt";
my $outfile = "Output.txt";
open(FH, "<$infile") or die "File not found";
open(OP, ">$outfile") or die "Output File not found";
my $str = "hwsapbc05pvz ps -ef |grep prd | grep -v grep | wc -l"; # which should only match 6th line from text document
while(<FH>)
{
$line = $_;
chomp($line);
if($line =~ m/\b$str\b/)
{
print OP "$line\n";
}
}
close FH;
close OP;由于ps -ef存在于所有行中,因此它与所有行都匹配。但是,整个字符串"hwsapbc05pvz ps -ef |grep prd | grep -v grep | wc -l“在文本文档中是唯一的。如何匹配精确的string.Please帮助。提前感谢
发布于 2015-11-10 16:16:44
如果将此变量包含在regex中,解析器将使用管道
hwsapbc05pvz ps -ef |grep prd | grep -v grep | wc -l
↑ OR ↑ OR ↑ OR匹配任何匹配的子字符串。要按字面意思匹配所有字符串,请尝试\Q escape
if($line =~ m/\b\Q$str\E\b/)See demo at regex101或尝试使用quotemeta my $escaped_str = quotemeta($str);
发布于 2015-11-10 16:16:47
您的模式中的"|“需要用反斜杠进行转义,并且$str的开头需要有qr。更改脚本的第5行,它在我的环境中起作用。
my $str = qr"hwsapbc05pvz ps -ef \|grep prd \| grep -v grep \| wc -l"; 发布于 2015-11-10 19:57:04
subhas Chandra :我已经修改了您的代码,并将其发布在下面。现在应该可以正常工作了。
use strict;
use warnings;
my $infile = "Input.txt";
my $outfile = "Output.txt";
open(FH, "<$infile") or die "File not found";
open(OP, ">$outfile") or die "Output File not found";
my $str = "hwsapbc05pvz ps -ef |grep prd | grep -v grep | wc -l"; # which should only match 6th line from text document
my $finalstr = quotemeta($str);
while(<FH>)
{
my $line = $_;
chomp($line);
if($line =~ m/$finalstr/)
{
print OP "$line\n";
}
}
close FH;
close OP;https://stackoverflow.com/questions/33624978
复制相似问题