2010-10-13 91 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