2017-09-13 31 views
0

我的代码中有一条线,如下,

my $status = `/usr/bin/ps -ef | grep $_ | grep -v grep | awk '{print\$2}'`; 

哪些$ _包含字符串如下,

/家庭/生产/ AGT/PtpAgent .SH

我可以改变$ _输出值是 'PtpAgent' 在执行命令,例如,

my $status = `/usr/bin/ps -ef | grep <some_regex_pattern>$_<some_regex_pattern> | grep -v grep | awk '{print\$2}'`; 
+0

当然可以。但是,这里有什么问题,它不适合你吗? – yacc

+0

@yacc不适合我,我尝试多个正则表达式模式,但仍然无法获得输出为'PtpAgent' – MrAZ

+0

提供一些不起作用的示例。 – yacc

回答

1

可以,我建议你使用s ///默认为$ _

s#.*/(.*?)\.sh$#$1# 

你也可以做

$_=~s#.*/(.*?)\.sh$#$1#; 

$_="some text"; 

让我也建议您将管道保持在最低限度,只需使用perl进行过滤。它更清洁

my $status = qx(/usr/bin/ps -ef) ; 
$status=~s/.*\n.*?(grep.*?)\n.*/$1/m; #adjust the capture group accordingly 

但是,这只是个人的喜好。

1

hoffmeister最小化管道和使用PERL正则表达式的方法会很好,因为您只需分割“/”并获取最后一个元素来获取所需的字符串。然后你可以很容易地通过管道的下一个阶段。