我正在尝试构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 { $_ = ""; }'