2

正規表現のみを使用して、IP アドレス (v4) から 3 番目の数字を取得したいと考えています。

ここにはたくさんのIPがあります

172.23. 34 .159
172.23. 34 .51 211.234
202.246 147.6
. 41 .120 172.23
. 34 .171
10.225. 149 .118
172.23。34.64 _

それは可能ですか?

4

3 に答える 3

1

これは、少なくともで動作するはずです:

\b\d{1,3}\.\d{1,3}\.\K\d{1,3}(?=\.\d{1,3}\b)

または、より強力なものが必要な場合:

\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.\K(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)

あなたはそれを試すことができます

$ re='\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.\K(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)'
$
$ perl -lne 'print $& if /'"$re"'/' file.txt
34
34
202
41
34
149
34
$ 
$ grep -oP "$re" file.txt
34
34
202
41
34
149
34
于 2012-11-07T02:42:17.247 に答える
1

BRE では:

/^[0-9]\{1,3\}\.[0-9]\{1,3\}\.\([0-9]\{1,3\}\)\.[0-9]\{1,3\}$/

またはEREで:

/^[0-9]+\.[0-9]+\.([0-9]+)\.[0-9]+$/

sed古いオペレーティング システムのようなものを使用している場合は、BRE に制限されている可能性があります。すべての正規表現の実装に後方参照が含まれているわけではないことに注意してください。そのため、正規表現以外のものを使用してこの情報を取得する方が先かもしれません。たとえば、awk次のようになります。

[ghoti@pc ~]$ echo "10.11.12.13" | awk -F. '{print $3}'
12

または単に純粋な bash:

[ghoti@pc ~]$ addr="10.11.12.13"
[ghoti@pc ~]$ addr=${addr#*.*.}
[ghoti@pc ~]$ addr=${addr%.*}
[ghoti@pc ~]$ echo $addr
12
于 2012-11-07T03:12:12.047 に答える
1

正規表現に関して言えば、データについて知れば知るほど、それを解析/変更するための準備が整います。たとえば、すでにわかっている配列または信頼できるファイルがある場合、(Perl では) 次のように単純な IP アドレスのみが含まれます。

    my @ips = qw(172.23.34.159
                 172.23.34.51
                 211.234.202.246
                 147.6.41.120
                 172.23.34.171
                 10.225.149.118
                 172.23.34.64);
    for (@ips) {
        print "$1\n" if $_ =~ /(?:\d+\.){2}(\d+)\.\d+/;
    }

また

    while (<>) {
        print $1\n" if $_ =~ /^\s*(?:\d+\.){2}(\d+)\.\d+\s*$/;
    }

で十分です。一方、外部ソースまたは多くの異なるデータ型を含むファイルからデータを収集している場合は、より厳密にする必要があります (その場合、sputnickはすでに適切に厳密な例を提供しています) 。

于 2012-11-07T08:46:13.510 に答える