Perl一行代码+匹配IP地址

我正在尝试构buildPerl一行代码
与文件中的IP地址完全匹配,并打印匹配的IP

如果IP不匹配,则不会打印IP地址。

备注 – 在IP地址的左侧/右侧[左侧] xxx.xxx.xxx.xxx [右侧] – 可以是任何字符,但IP本身必须完全匹配

问题是,不pipe我在echo之后放什么,Perl都会打印任何string

请指教我的语法有什么问题?

一些例子

# export IP=23.45.7.0 

应该匹配IP

  # echo 23.45.7.0 | perl -pe 'next if /^*#/;/(\b|\D)$ENV{IP}(\b|\D)/' 23.45.7.0 

不应该匹配IP

  # echo 123.45.7.0 | perl -pe 'next if /^ *#/; /(\b|\D)$ENV{IP}(\b|\D)/' 123.45.7.0 

应该匹配IP

  # echo IP23.45.7.0IP | perl -pe 'next if /^ *#/; /(\b|\D)$ENV{IP}(\b|\D)/' IP23.45.7.0IP 

不应该匹配IP

  # echo 23.45.7.00 | perl -pe 'next if /^ *#/; /(\b|\D)$ENV{IP}(\b|\D)/' 23.45.7.00 

为了匹配常见的模式,你可以在这种情况下看Regexp :: Common ,特别是Regexp::Common::net

根据您的规格:

 echo 10.11.12.13|perl -MRegexp::Common=net -nE '$_=~/^$RE{net}{IPv4}{-keep}$/ and say $1' 

10.11.12.13

…而这个无效地址不匹配:

 echo 10.11.1200.13|perl -MRegexp::Common=net -nE '$_=~/^$RE{net}{IPv4}{-keep}$/ and say $1' 

你需要去掉多余的部分。 另外,你应该避开$IP的点,使它不符合例如23x45y7z0 。 比如像这样:

 #!/usr/bin/perl use strict; my $ip = quotemeta($ENV{IP}); while (<>) { next if (/^ *$/); # try to replace everything by just the IP, # print if the line matched s/^.*(${ip}).*$/$1/ && print; } 

一个丑陋的“单行”(删除新行以减少实际的行数和可读性):

 perl -e 'my $ip = quotemeta($ENV{IP}); while (<>) { next if (/^ *$/); s/^.*(${ip}).*$/$1/ && print; }' 

-p似乎在这里引起麻烦,因为如果它们不匹配,它会打印解析的行(参见man perlrun的解释)。 你可以防止这样的例子:

 perl -pe 'my $ip = quotemeta($ENV{IP}); next if (/^ *$/); if (s/^.*(${ip}).*$/$1/) { print; } else { $_ = ""; }'