Как я могу заменить только полные IP-адреса в файле, используя Perl? - PullRequest
0 голосов
/ 13 октября 2010

Я использовал следующий синтаксис 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

пример проблемы:

Я хочу изменить IP-адрес в файле с 1.1.1.1 на 5.5.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

Ответы [ 3 ]

2 голосов
/ 13 октября 2010

Вот что вы начинаете:

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
1 голос
/ 13 октября 2010

Вы должны использовать упреждающий и упреждающий синтаксис, см. Хорошую статью о perlmonks: http://www.perlmonks.org/?node_id=518444

0 голосов
/ 13 октября 2010

Для этого может быть проще написать короткий скрипт.

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...