当列满足正则表达式时,如何删除数组的行?
示例:
'0','john','192.168.0.1'
'1','james','192.168.1.1'
'2','pat','192.168.0.1'
我想删除第三列中包含xxx.xxx.1.x的所有行(或保存不包含...的行)。
也许egrep将是最好的解决方案(因为我不想使用耗时的循环),但我不知道如何指定列和正则表达式。
答案 0 :(得分:5)
你无法避免“耗时的循环” - 你认为“grep”的作用是什么,但是逐行循环 - 并进行测试?
但是,您可以使用perl grep
函数,除了正则表达式之外,还允许使用代码解决方案。
所以这样的事情有效:
#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @stuff = (
[ '0', 'john', '192.168.0.1' ],
[ '1', 'james', '192.168.1.1' ],
[ '2', 'pat', '192.168.0.1' ]
);
print Dumper \@stuff;
my @new_array = grep { not $_->[2] =~ m/\.1\.\d+$/ } @stuff;
print "Entries which match:\n";
print Dumper \@new_array;
虽然没有幻想 - grep正在通过你的阵列'循环'。它只是隐藏了这就是它正在做的事实。 (egrep
会做同样的事情,所以你不会丢失任何东西)。
答案 1 :(得分:0)
IP的正则表达式在第3位置为'1'可能是:
/\d{1,3}\.\d{1,3}\.1\.\d{1,3}/