我有一个类似于以下行的文件:
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;
}
}
答案 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