匹配特定字符,如果找到则打印

时间:2014-11-06 17:43:50

标签: regex perl

我试图打印文件中的每一行,如果它们在特定位置包含单个字符,那么首先是' +'但我将使用' - '运行相同的程序。代码运行但没有提供输出,我确信这是一个非常简单的错误,因为我检查了正则表达式并且有效!

FILE1数据:

3628 -a
9712 +T
11004 -a
11379 -a
12715 +T
14184 +T

输出:

9712 +T
12715 +T
14184 +T

代码:

#!/usr/bin/perl 

use strict;
use warnings;
use autodie;

my $outputfile = "/Users/edwardtickle/Documents/indelfinal.txt"; 

open FILE1, "/Users/edwardtickle/Documents/indelcount.txt";

open (OUTPUTFILE, ">$outputfile");

while (<FILE1>) {
    if (/^(\d+)\s+(\S)(\S)/) {
    if ($2 =~ m/'+'/) {
    print OUTPUTFILE "$1 $2$3\n";
    }
}
}

close FILE1;
close OUTPUTFILE;

干杯!

4 个答案:

答案 0 :(得分:4)

if ($2 =~ m/'+'/) {

这是一个正则表达式匹配,因此它没有按照您的想法执行。如果$2+-或其他)包含至少两个撇号的序列($2的长度始终为1,那么这将匹配,因此这可以永远不会发生。)

您需要进行字符串比较:

if ( $2 eq '+' ) {

答案 1 :(得分:1)

以下正则表达式可以帮助您确定字符串中第二个(特定)位置的+

m/\+.$/ 

例如

#!/usr/bin/perl 

use strict;
use warnings;
use autodie;


open FILE1, "input";


while (<FILE1>) {
    if ($_  =~ m/\+.$/ ) {
    print  "$_";
    }
}

close FILE1;

将产生输出

9712 +T
12715 +T
14184 +T

它的作用是什么?

  • \++

  • 相匹配
  • .匹配任何单个字符

  • $匹配字符串的结尾。

答案 2 :(得分:0)

您的输入中似乎只能有一个+或一个-,因此在您进行测试之前将这一行拆分为字段是没有意义的。这就是你所需要的一切。

while (<FILE1>) {
    print OUTPUTFILE $_ if /\+/;
}

或,在单行命令中

perl -ne'print if /\+/' indelcount.txt > indelfinal.txt

请注意,后者要求您当前的工作目录为/Users/edwardtickle/Documents

答案 3 :(得分:0)

它给出了你期望的东西

use warnings; use strict;
open('new',"file1");
my @ar = <new>;
my @vz = grep{m/\+/g} @ar;
print @vz,"\n";

我使用grep运算符将特定单词与文件中的句子匹配。