簡體   English   中英

如何僅替換Perl中IP地址的前三個八位字節

[英]How does one replace only the three first octects of an IP address in Perl

我的目標是用新的IP地址僅替換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與最后三個數字匹配,它將同時替換它們

所以

為了只替換IP地址中的前三個數字,我需要在Perl命令中進行哪些更改?

實際的Example1描述了問題:

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

#!/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版本; 應該放到您的shell腳本中...

# 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

那只是您的代碼存在的三個問題之一。 其他兩個是:

  • 您的代碼將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'

筆記:

  • 如果IP地址始終位於行的開頭, ^甚至比(?<![\\d.])還要好。 /g將變得無用。)
  • 如果IP地址始終以空格,制表符開頭或始終位於行首,則(?<!\\S)甚至會比(?<![\\d.])更好。

如果每個IP地址單獨顯示在一行上,這很容易:

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

如果不是,則可以在否定式后面使用斷言:

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

這將匹配並替換OLD_IP給出的字符串,除非它OLD_IP跟隨數字或句點。

編輯:要解決ikegami指出的問題,您還應確保匹配的字符串后沒有數字:

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

與ikegami的解決方案不同,它適用於任意數量的八位位組,而不僅僅是三個或更少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM