0

以下 perl 班轮代码将与 IP 地址完全匹配

perl -ne 'BEGIN{$ip=shift(@ARGV);} 
    print if /^\Q$ip\E$/;' "$IP_ADDRESS"  $FILE

问题是如果 $IP_ADDRESS 之前或之后的空格或制表符,我们无法通过以下 perl 代码匹配

请建议需要在我的代码中添加什么以忽略空格和制表符?

来自我的 linux 机器的示例

$ echo "192.9.200.1" |
    perl -ne 'BEGIN{$ip=shift} 
        print if/^\Q$ip\E$/;' "192.9.200.1"
192.9.200.1  ( MATCH )

$ echo " 192.9.200.1" |
    perl -ne'BEGIN{$ip=shift} 
        print if/^\Q$ip\E$/;' "192.9.200.1"
NO MATCH

echo "192.9.200.1 " |
    perl -ne'BEGIN{$ip=shift}
        print if/^\Q$ip\E$/' "192.9.200.1"
NO MATCH

预期成绩

echo "192.9.200.1 "|
    perl -ne'BEGIN{$ip=shift}
        print if/^\Q$ip\E$/;' "192.9.200.1"
should MATCH

echo "192.9.200.1"|
    perl -ne'BEGIN{$ip=shift}
        print if/^\Q$ip\E$/;' "192.9.200"
should NOT MATCH

echo "192.9.200.1"|
    perl -ne'BEGIN{$ip=shift}
        print if/^\Q$ip\E$/;' "192.9.200."
should NO MATCH
4

4 回答 4

1

试试这个:

print if /(^|\s)\Q$ip\E(\s|$)/;
于 2013-05-01T10:40:23.487 回答
0

您可以先修剪前导和尾随空格:

perl -ne '
    BEGIN { $ip = shift @ARGV; }
    s/^\s+|\s+$//g;
    print if /^\Q$ip\E$/; 
' "$IP_ADDRESS"  $FILE
于 2013-05-01T11:23:12.830 回答
0

试试这个正则表达式

 /\s*\Q$ip\E\s*$/

\s* 匹配 0 个或多个空格字符

于 2013-05-01T10:30:21.967 回答
0

你可以使用Regexp::Common::net

perl -MRegexp::Common=net -nE 'say +($_=~/^$RE{net}{IPv4}{-keep}$/)?q(MATCH):q(NO MATCH)'
192.9.200.1
MATCH
        192.9.200.1
NO MATCH
    192.999.200.1
NO MATCH

这具有检测 IP 地址的无效模式的额外优势。

于 2013-05-01T11:14:57.140 回答