Если у Вас есть доступ оболочки ко всем ведомым серверам, существует простое решение:
Чтобы смочь постепенно уменьшить порядковый номер на ведомых серверах, можно войти в ведомый сервер и работать rndc retransfer my.zone.name
. Это заставит ведомое устройство выбирать зону от ведущего устройства и полностью игнорировать порядковый номер.
Вы могли сделать что-то вдоль этих строк:
file=/some/file
newtext='sol { mass = 42, start = 9.2 }'
tac -- "$file" |
NEWTEXT=$newtext awk -v size="$(wc -c < "$file")" '
$1 ~ /^[^#]/ {
system("dd bs=1 seek=" size - length(footer) " conv=notrunc if=/dev/null")
printf "%s\n%s", ENVIRON["NEWTEXT"], footer
exit
}
{footer=$0 "\n" footer}' 1<> "$file"
Это перезаписывает файл на месте и только хранит нижний колонтитул в памяти. Этому нужен нестандартный GNU tac
команда. Файл должен быть файлом обычного текста.
awk
только решение (протестированный с простофилей):
$ awk '
BEGIN { footer = ""; wl = ""; }
END { while(( getline line < "sol.txt") > 0 ) {
print(line)
}
footer = wl footer
print substr(footer, 0, length(footer)-1);
}
# Blank line
/^[[:blank:]]*$/ {
if (footer) {
footer = wl footer
print substr(footer, 0, length(footer)-1);
footer = ""
}
wl = $0 "\n"
}
# Comment only
/^[[:blank:]]*#/ {
footer = footer $0 "\n";
}
# Configuration line
/^[[:blank:]]*[^[:space:]#]/ {
print(wl footer $0); wl = ""; footer = "";
}
' < universe.txt > universe2.txt
Создание:
# Universe configuration
#
pi = 3 # A good #
e = mc**2 # To within a hair
[cut 200 trillion lines]
sol { mass = 42, start = 9.2 }
#
# END
#
С одной разностью строки:
sh$ diff universe*.txt
8d7
< sol { mass = 42, start = 9.2 }
Это - конфигурационный файл, таким образом, он подходит удобно к памяти. Нет никакой потребности обработать его как поток.
newline='
' tab=$(echo | tr '\n' '\t')
old=$(cat foo.config)
footer=${old##*"$newline[!$newline$tab #]"}
if [ "$footer" = "$old" ]; then
footer=
else
footer=${footer#*"$newline"}
fi
head=${old%"$footer"}
echo "$head$text_to_insert$footer" >foo.config.new
ex
команда почти в три раза медленнее, чем это, даже на 267-байтовом файле. – l0b0 07.06.2013, 15:27ex
не решение, оно должно считать целый файл, прежде чем выполнят команду. – cuonglm 07.06.2013, 15:29ex
должен будет считать целый файл, но не сохранить целое содержание в памяти (хотя это должно будет все еще сохранить изрядный объем информации в памяти). YMMV в зависимости отex
реализация. – Stéphane Chazelas 07.06.2013, 15:39ex
(читая файл), был намного больше, чем объединенное время запускаtac
,awk
иdd
плюс подоболочка. – l0b0 07.06.2013, 16:04awk
3.1.4, но не сmawk
1.2. Никакой вывод и никакие изменения в файле. – l0b0 07.06.2013, 16:27