【问题标题】:Remove leading zeros only in IP addresses仅删除 IP 地址中的前导零
【发布时间】:2014-09-16 23:16:02
【问题描述】:

我需要从所有 IP 地址中删除 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

有什么想法吗?

【问题讨论】:

  • 举个例子会更好。
  • 我附上了CSV前后的例子。

标签: regex perl ip


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    试试这个:

    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】:

      这适用于您的示例数据:

      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

      【讨论】:

      • 好的,知道了。但我一直在寻找更通用的方法,不依赖 IP 在第一列。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-01-20
        • 2015-03-18
        • 1970-01-01
        • 2012-04-14
        • 2017-06-13
        • 1970-01-01
        • 2021-11-27
        • 2014-01-27
        • 1970-01-01
        相关资源
        最近更新 更多