首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在perl中匹配带有空格和特殊字符的精确句子

如何在perl中匹配带有空格和特殊字符的精确句子
EN

Stack Overflow用户
提问于 2015-11-10 15:40:11
回答 3查看 761关注 0票数 1

我是Perl正则表达式的初学者。我正在从一个文本文档中读取内容,并试图提取与所需字符串完全匹配的行,该字符串包含空格和特殊字符,即"hwsapbc05pvz ps -ef |grep prd | grep -v grep | wc -l“。下面是文本文档中的内容

代码语言:javascript
复制
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

我已经写好了代码

代码语言:javascript
复制
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帮助。提前感谢

EN

回答 3

Stack Overflow用户

发布于 2015-11-10 16:16:44

如果将此变量包含在regex中,解析器将使用管道

代码语言:javascript
复制
hwsapbc05pvz ps -ef |grep prd | grep -v grep | wc -l
                    ↑ OR      ↑ OR           ↑ OR

匹配任何匹配的子字符串。要按字面意思匹配所有字符串,请尝试\Q escape

代码语言:javascript
复制
if($line =~ m/\b\Q$str\E\b/)

See demo at regex101或尝试使用quotemeta my $escaped_str = quotemeta($str);

票数 1
EN

Stack Overflow用户

发布于 2015-11-10 16:16:47

您的模式中的"|“需要用反斜杠进行转义,并且$str的开头需要有qr。更改脚本的第5行,它在我的环境中起作用。

代码语言:javascript
复制
my $str = qr"hwsapbc05pvz ps -ef \|grep prd \| grep -v grep \| wc -l";  
票数 1
EN

Stack Overflow用户

发布于 2015-11-10 19:57:04

subhas Chandra :我已经修改了您的代码,并将其发布在下面。现在应该可以正常工作了。

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33624978

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档