我需要remoe在CSV所有前导零的所有IP地址,而不是其他(如主机名)。
我得到了下面的,它不删除所有
s/(?<!\d)0+(?=\d)//g
CSV范例:
192.168.001.000,any comment,host0003.zone.com
010.001.100.000,any long 000 string,host004.zone.com
应该成为
192.168.1.0,any comment,host0003.zone.com
10.1.100.0,any long 000 string,host004.zone.com
有任何想法吗?
尝试Regexp::Common
和Net::IP
,如果你不介意使用CPAN模块。
$ <sample.csv perl -MRegexp::Common -MNet::IP -ple 's/($RE{net}{IPv4})/Net::IP->new($1)->ip/ge'
尝试这个:
use strict;
use warnings;
use Data::Dumper;
for (<DATA>) {
print join(",",map{ if($_=~/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/s){$_=~s/^0*(\d+)/$1/sg;$_=~s/^0*?\./0/sg;$_=~s/\.0+(\d+)/\.$1/sg;$_;}else{$_} } split /,/is,$_);
}
__DATA__
192.168.001.000,any comment,host0003.zone.com
010.001.100.000,any long 000 string,host004.zone.com
这适用于您的数据。例如:
use strict;
use warnings;
while(my $line = <DATA>) {
$line =~ s/(?:^|\.)0+(?=\d)//g;
print $line;
}
__DATA__
192.168.001.000,any comment,host0003.zone.com
010.001.100.000,any long 000 string,host004.zone.com
打印:
192.168.1.0,any comment,host0003.zone.com
10.1.100.0,any long 000 string,host004.zone.com
在任何情况下,我强烈建议您使用CPAN模块来解析CSV文件,如文字:: CSV 。
下面的正则表达式的UNIX可以帮助:
',\{0,2\}\([0][0-9]\{2\}\.\)\([0-9]\{3\}\.\)\{2\}'.