仅在IP地址中删除前导零

时间:2014-07-25 07:11:38

标签: regex perl ip

我需要从所有IP地址中删除csv中的所有前导零,而不是其他(如主机名)。

我得到了以下内容,它确实删除了所有

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

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

如果您不介意使用CPAN模块,请尝试Regexp::CommonNet::IP

$ <sample.csv perl -MRegexp::Common -MNet::IP -ple 's/($RE{net}{IPv4})/Net::IP->new($1)->ip/ge'

答案 1 :(得分:1)

这适用于您的示例数据:

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文件,例如Text::CSV

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:-1)

下面的unix正则表达式可能有所帮助:

',\{0,2\}\([0][0-9]\{2\}\.\)\([0-9]\{3\}\.\)\{2\}'.