1

私の目標は、IPアドレスの最初の3桁のみを新しいIPアドレスに置き換えることです。たとえば

 NEW three first three digits – 17.100.10
 OLD three first three digits - 12.200.10 
 Existing IP address in file  - 12.200.10.2 

次に、新しい IP を17.100.10.2として取得します

そこで、置換アクションを実行するために、次の Perl コマンドを記述します。

しかし問題は、新しい IP が最後の 3 桁と一致する場合、それらも置き換えられることです。

そう

IP アドレスの最初の 3 桁のみを置き換えるには、Perl コマンドで何を変更する必要がありますか?

問題を説明した実際の例1:

export OLD_IP=192.9.1
export NEW_IP=172.192.9

.

echo 1.192.9.1 | perl -i -pe 'next if /^ *#/; s/(\b|\D)$ENV{OLD_IP}(\b|\D)/$1$ENV      {NEW_IP}$2/g'  
 1.172.192.9

.

4

3 に答える 3

4
#!/bin/perl

my @ip = split('\.', $old_ip);
$ip[0] = 172;
$ip[1] = 16;
$ip[2] = 0;
$new_ip = join(".", @ip);

また

#!/bin/perl

my @ip = split('\.', $old_ip);
$new_ip = '172.16.0.' . $ip[3];

また

s/(\d{1,3}\.){3}(?=(\d+$))/$ENV{new_ip}/

単一行、WTF、バージョンの場合。それはあなたのシェルスクリプトにドロップするはずです...

# export new_ip=172.168.0.
# echo 192.168.5.6 | perl -i pe 's/(\d{1,3}\.){3}(?=(\d+$))/$ENV{new_ip}/'
172.16.0.6
于 2012-12-26T13:44:39.520 に答える
3

これは、コードが抱える 3 つの問題のうちの 1 つにすぎません。他の 2 つは次のとおりです。

  • コードが192.9.100.1(OLD_IP=192.9.1 で) から172.192.900.1(NEW_IP=172.192.9 で) に変わります。

  • コードが192.101.1.2(OLD_IP=192.1.1 で) から172.192.9.1.2(NEW_IP=172.192.9 で) に変わります。

解決:

perl -pe's/(?<![\d.])\Q$ENV{OLD_IP}\E(?=\.\d)/$ENV{NEW_IP}/g'

ノート:

  • ^(?<![\d.])IP アドレスが常に行の先頭にある場合よりもさらに優れています。(それ/gは役に立たなくなります。)
  • (?<!\S)(?<![\d.])IP アドレスの前にスペースやタブが常にある場合や、常に行頭にある場合よりもさらに優れています。
于 2012-12-27T00:12:00.523 に答える
0

各 IP アドレスが 1 行に表示される場合、これは簡単です。

s/^\Q$ENV{OLD_IP}\E/$ENV{NEW_IP}/mg

そうでない場合は、否定の後読みアサーションを使用できます。

s/(?<![\d.])\Q$ENV{OLD_IP}\E/$ENV{NEW_IP}/g

OLD_IPこれは、数字またはピリオドの後に続く場合を除いて、 で指定された文字列と一致して置き換えます。

編集:池上が指摘した問題を修正するには、一致した文字列の後に数字が続かないことも確認する必要があります。

s/(?<![\d.])\Q$ENV{OLD_IP}\E(?!\d)/$ENV{NEW_IP}/g

池上の解決策とは異なり、これは 3 つ以下だけでなく、任意の数のオクテットに対して機能します。

于 2012-12-27T00:13:58.027 に答える