2010-10-13 92 views
0

我用下面的Perl語法,以替換字符串或IP地址的文件:問題如何用Perl替換文件中的完整IP地址?

OLD=aaa.bbb.ccc.ddd (old IP address) 
NEW=yyy.zzz.www.qqq (new IP address) 

export OLD 
export NEW 

perl -pe 'next if /^ *#/; s/\Q$ENV{OLD }\E/$1$ENV{NEW }$2/' file 

例如:

我想從1.1.1.1到5.5更改文件中的IP地址.5.5

,但我得到以下幾點:

more file (before change) 

11.1.1.10 machine_moon1 



more file (after change) 

15.5.5.50 machine_moon1 

據「改變例子之後)的IP‘11.1.1.10’必須留下來,因爲它是的,因爲我想只改變1.1.1.1,而不是11.1.1.10

我需要幫助我的perl的一個行語法:

如何只根據以下規則改變我的perl語法:

RULE: Not change the IP address if:left IP side or right IP side have number/s 

IP=1.1.1.1  
IP=10.10.1.11 
IP=yyy.yyy.yyy.yyy 

[number]1.1.1.1[number] - then not replace 

[number]10.10.1.11[number] - then not replace 

[number]yyy.yyy.yyy.yyy[number] - then not replace 



Other cases: 

    [any character beside number ]yyy.yyy.yyy.yyy[[any character beside number ]] - then replace 

回答

2

這裏是你開始有什麼用:

OLD=1.1.1.1 
NEW=5.5.5.5 

export OLD 
export NEW 

~/sandbox/$ cat file 
1.1.1.10 machine1 
11.1.1.10 machine2 
11.1.1.1 machine3 
1.1.1.1 machine4 
A1.1.1.1 machine5 
A1.1.1.1 machine6 
1.1.1.1Z machine7 

如果錨圖案只在字邊界或非數字(見perlre)的比賽,你應該只匹配一個完整的IP地址:

~/sandbox/$ perl -pe 'next if /^ *#/; s/(\b|\D)$ENV{OLD}(\b|\D)/$1$ENV{NEW}$2/' file 
1.1.1.10 machine1 
11.1.1.10 machine2 
11.1.1.1 machine3 
5.5.5.5 machine4 
A5.5.5.5 machine5 
A5.5.5.5Z machine6 
5.5.5.5Z machine7 
+0

如果右側或左側沒有數字,則不起作用:echo A1.1.1.1 | perl -pe'next if/^ *#/; s/\ b $ ENV {OLD} \ b/$ ENV {NEW} /' – jon 2010-10-13 19:52:06

+0

那麼,OP沒有說明,但是這個版本是關於你在找什麼的?注意我只是將\ D(非數字)更改爲\ b | \ D(字邊界或非數字),並用parens進行捕獲。 – 2010-10-13 19:57:49

+0

是的,現在它的確定,「\ D」使它能夠取代它,如果它的特點 – jon 2010-10-13 20:02:22

0

編寫一個簡短的腳本來執行此操作可能會更容易。

use strict; 
use autodie; 

my $old_ip = 10.1.1.1; # or $ENV{'OLD'} 
my $new_ip = 50.5.5.5; # or $ENV{'NEW'} 

open my $infh, '<', $ARGV[0]; 
open my $outfh, '>', $ARGV[1]; 
while (my $line = <$infh>) { 
    chomp $line; 
    my @elems = split '\s+', $line; 
    next unless $elems[0] eq $old_ip; 
    print $outfh $new_ip . join(" ", @elems[1..$#elems]) . "\n"; 
} 
close $outfh; 
close $infh; 
+0

喜CanSpice問候 - 我的目標是修復我的Perl一行語法來支持我的情況 – jon 2010-10-13 19:43:50

+0

任何方式我不能用你的考試因爲perl語法是我的bash腳本的一部分 – jon 2010-10-13 19:45:10

+0

@jon =>您可以隨時將代碼保存到一個文件中,並使用perl從腳本中調用該文件,一些問題最好通過長格式解決 – 2010-10-13 19:59:30