[英]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'
筆記:
^
甚至比(?<![\\d.])
還要好。 ( /g
將變得無用。) (?<!\\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.