3

ファイルの IP アドレスと正確に一致する Perl の 1 行のライナー
を作成し、一致した IP を出力しようとしています。

IP が一致しない場合、IP アドレスは表示されません。

備考 - IP アドレスの左側/右側 [左]xxx.xxx.xxx.xxx[右] - 任意の文字を使用できますが、IP 自体は正確に一致する必要があります

問題は、echo の後に何を入力したかではなく、Perl がとにかく任意の文字列を出力することです。

私の構文の問題は何ですか?

いくつかの例

     # 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
4

2 に答える 2

1

一般的なパターンを一致させるには、この場合は特にRegexp::CommonRegexp::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'
于 2012-12-28T15:03:24.387 に答える
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 { 
        $_ = ""; 
    }'
于 2012-12-28T13:02:02.113 に答える