Что-то вроде этого?
new="5.5.5.5" perl -pe 's/(allow from 1.1.1.1 ).*?( 2.2.2.2)/$1$ENV{new}$2/' $YOUR_FILE
Для файла, содержащего
allow from 1.1.1.1 9.9.9.9 2.2.2.2
allow from 1.1.1.1 x 2.2.2.2
allow from 1.1.1.1 3.3.3 2.2.2.2
Он выведет следующее:
allow from 1.1.1.1 5.5.5.5 2.2.2.2
allow from 1.1.1.1 5.5.5.5 2.2.2.2
allow from 1.1.1.1 5.5.5.5 2.2.2.2
Он заменил все, что находится между "разрешить от 1.1.1.1 »и« 2.2.2.2 »с содержанием переменной $new
, определенной перед командой perl.
Если вы хотите убедиться, что вы заменяете только группы из 4 цифр, разделенных точками, вы можете заменить .*?
в регулярном выражении на что-то вроде \d\.\d\.\d\.\d
. Если это адреса IPv4, вы также можете использовать \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
или менее строгий [\d\.]{7,15}
(от 7 до 15 символов, все точки или цифры).
Если вы хотите сделать это «на месте» вместо распечатав результат в STDOUT, вы можете добавить -i.bak
в качестве первого варианта. Это сначала создаст резервную копию "$ YOUR_FILE" в "$ YOUR_FILE.bak"