2013-12-15 14 views
0

我做下一个使用awk:匹配的字符串被解析使用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

添加“use sctrict;”和“使用警告”;在你的perl脚本中。看起来你根本没有声明变量$ var1。 – alex

+0

我很抱歉,刚刚没有复制好,我编辑问题 – klerk

+0

然后,“secon”可以只是这个词的一部分。在Perl中使用$ var1 =〜/ secon /而不是eq。 – alex

回答

4

首先,你的问题是```包含换行符的结果。所以$var1不是"secon",而是"secon\n"。您可以处理任何数量的方式 - 包装chomp( ... )整个分配各地$var1,或改变eq的右侧包括"\n",或使用正则表达式来代替:带或不带chompif ($var1 =~ /^secon$/)作品,因为$匹配字符串最终换行符(如果存在)。

所有第二,你用大约两个节目太多了这里:

my $var1= `awk '/secon/ {print $1}' vladtest.sh |cut -c2-6` 

我的意思是,awk可以做任何事情cut可以做的,perl可以做任何事情,无论是可以做到的。当我在shell提示符下输入one-liners时,我很喜欢awkcut,只是为了他们的表达经济;在他们各自的专业领域内,他们的命令行通常比相应的命令行短(甚至使用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. 
+0

你可以跳过'open'并使用_null文件handle_(aka Diamond操作符)。 'print'不是'grep {/^\ s * \ Ssecon /} <>;'这会将命令行或STDIN提供的文件(就像其他的Unix命令一样)。 –

+0

当然,但是假定文件'vladtest.sh'作为Perl程序的命令行参数提供,并且它没有使用其命令行参数来处理其他事情。 –

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 

只要我们有一个匹配行,我们可以打印“OK”退出。否则,我们将在循环结束时打印“NOT OK”。

use 5.10.0;行是需要的,所以你可以使用say()

0

还有为落实这一要求,但按照你的想法目前,改变第一行来解决问题更好的方法。

my $var1= `awk '$1~/secon/ {print substr($1,2,5)}' vladtest.sh` 
+0

用'awk'内建替换'cut',但不能解决问题 - '$ var1'仍然是''secon \ n“',而不是'eq”secon“'。 –

+0

这是perl脚本,那么请求者应该知道如何删除\ n,然后通过chomp – BMW

+0

进行比较,但由于这是他们询问的整个问题,所以他们显然不会。我们不会根据他们不知道的内容来批评提问者。“ –