匹配perl中的字符串,用awk解析

时间:2013-12-15 21:07:27

标签: regex perl 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"
}

3 个答案:

答案 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提示符下输入单行内容时,我非常喜欢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.

答案 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`