Это изменит IP-адрес, связанный с хостом c
, на 1.2.3.4
:
$ sed 's/^ip/\nip/' file | perl -00pe 'if(/\nhost=c\n/){s/ip=\S+/ip=1.2.3.4/} s/\n\n/\n/'
ip=x.x.x.a
mask=255.0.0.0
host=a
ip=x.x.x.b
mask=255.0.0.0
host=b
ip=1.2.3.4
mask=255.0.0.0
host=c
ip=x.x.x.x
blahblah
mask=255.0.0.0
host=d
sed 's/^ip/\nip/' file
:добавьте дополнительную новую строку(\n
)к каждой строке, начинающейся с ip
. Я думаю, что это может работать не со всеми реализациями sed
, поэтому, если ваша не поддерживает это, замените команду sed
на perl -pe 's/^ip/\nip/'
. Это нужно для того, чтобы использовать «режим абзаца» Perl (, показанный ниже ).
perl -00pe
:-00
заставляет Perl работать в «режиме абзаца», где «строка» определяется двумя последовательными символами новой строки. Это позволяет нам рассматривать каждый блок хоста как одну «линию». -pe
означает «печатать каждую строку после применения к ней сценария, заданного -e
».
if(/\nhost=c\n/){s/ip=\S+/ip=1.2.3.4/}
:если эта «строка» (раздел )соответствует новой строке, за которой следует строка host=c
, а затем еще одна новая строка, то замените ip=
и 1 или более не -пробельных символов(\S+
)после нее с ip=1.2.3.4
.
s/\n\n/\n/
замените каждую пару новых строк одной новой строкой, чтобы вернуть исходный формат файла. Если вы хотите изменить файл на месте, вы можете использовать:
tmp=$(mktemp); sed 's/^ip/\nip/' file > $tmp;
perl -00pe 'if(/\nhost=c\n/){s/ip=\S+/ip=1.2.3.4/} s/\n\n/\n/' $tmp > file