perl regex用于多个匹配

时间:2015-10-27 19:07:54

标签: regex perl

我有一个类似于以下行的文件:

abcd1::101:xyz1,user,user1,abcd1,pqrs1,userblah,abcd1

我希望将字符串保留到最后“:”并删除所有出现的abcd1

最后,我需要在下面:

abcd1::101:xyz1,xyz2,xyz3,pqrs1,xyz4

我尝试了如下代码,但由于某种原因,它无法正常工作。所以请帮忙 帐户名称为“abcd1”

sub UpdateEtcGroup {
    my $account = shift;
    my $file = "/tmp/group";

    @ARGV = ($file);
    $^I = ".bak";
     while (<>){
         s#^($account::\d{1,$}:)$account,?#$1#g;
         s/,$//; # to remove the last "," if there
         print;
         }
 }

2 个答案:

答案 0 :(得分:2)

不要使用正则表达式。

use strict;
use warnings;

while (<DATA>) {
    chomp;
    my @parts = split(/:/, $_);
    $parts[-1] = join(',', grep { !/^abcd/ } split(/,/, $parts[-1]));
    print join(':', @parts) . "\n";
}

__DATA__
abcd1::101:xyz1,user,user1,abcd1,pqrs1,userblah,abcd1
abcd2::102:user1,xyz2,otheruser,abcd2,pqrs1,xyz4,abcd2

输出:

abcd1::101:xyz1,user,user1,pqrs1,userblah
abcd2::102:user1,xyz2,otheruser,pqrs1,xyz4

答案 1 :(得分:2)

split是工作的工具,而不是regex

因为split可让您可靠地将您 想要操作的字段与您不想操作的字段分开。像这样:

#!/usr/bin/env perl
use strict;
use warnings;

my $username = 'abcd1';

while ( <DATA> ) {
   my @fields = split /:/; 
   my @users = split ( /,/, pop ( @fields ) ); 
   print join ( ":", @fields, 
               join ( ",", grep { not m/^$username$/ } @users ) ),"\n"; 
}


__DATA__
abcd1::101:xyz1,user,user1,abcd1,pqrs1,userblah,abcd1