Это становится намного проще, если вы просматриваете файл в обратном порядке. К счастью, вы можете легко сделать это с помощью tac
(, который оказывается cat
наоборот ). Затем мы можем использовать относительно простой скрипт awk
для поиска вашего host
и изменить только егоip
:
$ tac input | awk -v OFS="=" -v myip="changed_address" -v myhost="d" -F"=" '$1 == "host" { if( $2 == myhost ) { sw = "on" } else { sw="off" } } sw == "on" && $1 == "ip" { $2=myip } { print $0 }' | tac
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=x.x.x.c
mask=255.0.0.0
host=c
ip=changed_address
blahblah
mask=255.0.0.0
host=d
Я подробно объясню, как работает awk
:
Во-первых, мы объявляем несколько переменных :по одной для host
и новое значение для ip
:
-v myip="changed_address" -v myhost="d"
Далее объявляем разделитель полей для ввода и вывода:
-v OFS="=" -F"="
Теперь собственно сам awk
скрипт:
$1 == "host" { // If we see the "host" line..
if( $2 == myhost ) { // And it matches the one we're looking for..
sw = "on" // Set a flag to swap the next IP
} else {
sw="off" // Otherwise, unset the flag
}
}
sw == "on" && $1 == "ip" { // If the flag is set and this is an IP line..
$2=myip // Swap in the new IP
}
{
print $0 // Finally, print out the processed line
}
Как только все это будет сделано, мы просто используем tac
еще раз, чтобы повторно -перевернуть его, снова сделав его вперед.
Существует патч noborder, который удаляет границу, когда видно только одно окно.https://dwm.suckless.org/patches/noborder/