我接下来用awk做了:
awk '/secon/ {print $1}' vladtest.sh |cut -c2-6
如何在perl循环中以适当的方式匹配此字符串:
my $var1= `awk '/secon/ {print $1}' vladtest.sh |cut -c2-6`
if ($var1 eq "secon"){
print "OK";
} else {
print "FALSE"
}
答案 0 :(得分:4)
首先,你的问题是`...`的结果包括换行符。因此$var1
不是"secon"
,而是"secon\n"
。您可以采用多种方式处理 - 将chomp(
... )
围绕整个作业包裹到$var1
,或更改eq
的右侧以包含"\n"
,或使用正则表达式:if ($var1 =~ /^secon$/)
使用或不使用chomp
,因为$
匹配字符串最终换行符(如果存在)。
其次,你在这里使用的程序太多了两个:
my $var1= `awk '/secon/ {print $1}' vladtest.sh |cut -c2-6`
我的意思是,awk
可以执行cut
可以执行的任何操作,perl
可以执行任何操作。当我在shell提示符下输入单行内容时,我非常喜欢awk
和cut
,只是为了表达它们的经济性;在各自的专业范围内,他们的命令行通常比同等命令行短(甚至使用perl -a
等)。但是因为你已经在Perl程序中了,所以没有理由在这里讨论别的东西。
以下是上述替换的示例:
my $var1;
{
open(my $fh, '<', 'vladtest.sh');
while (<$fh>) {
$var1 .= substr(split(' ')[0],1,5)."\n" if /secon/;
}
}
但如果您只是想检测是否匹配,则无需完成所有操作。
{open(my $fh, '<', 'vladtest.sh');
print 'NOT ' unless grep { /^\s*\Ssecon/ } <$fh>;
say 'OK';} # or print "OK\n"; if you don't have 5.10 extensions enabled.
答案 1 :(得分:0)
我的awk有点生疏,但你抓住1美元然后寻找2到6的角色来匹配'secon'。如果任何行与此匹配,则打印“OK”,否则“NOT OK”。这是perl唯一的解决方案:
use 5.10.0;
while (<>) {
if (/^\s*\Ssecon/) {
say 'OK';
exit 0;
}
}
say 'NOT OK';
exit 1;
正则表达式由以下内容组成:
^ match the start of each line, followed by
\s* zero or more whitespace characters, followed by
\S one non-whitespace character, followed by
secon the literal string that you're interested in
只要我们有匹配的行,我们就可以打印'确定'然后退出。否则我们将在循环结束时打印并打印“不行”。
需要use 5.10.0;
行,以便您使用say()
。
答案 2 :(得分:0)
有更好的方法来实现此请求,但请按照您当前的想法,更改第一行以解决问题。
my $var1= `awk '$1~/secon/ {print substr($1,2,5)}' vladtest.sh`