正規表現のみを使用して、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 _
それは可能ですか?
正規表現のみを使用して、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 _
それは可能ですか?
\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
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
正規表現に関して言えば、データについて知れば知るほど、それを解析/変更するための準備が整います。たとえば、すでにわかっている配列または信頼できるファイルがある場合、(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はすでに適切に厳密な例を提供しています) 。