Как вставить текст после последней строки конфигурации?

Если у Вас есть доступ оболочки ко всем ведомым серверам, существует простое решение:

Чтобы смочь постепенно уменьшить порядковый номер на ведомых серверах, можно войти в ведомый сервер и работать rndc retransfer my.zone.name. Это заставит ведомое устройство выбирать зону от ведущего устройства и полностью игнорировать порядковый номер.

5
23.05.2017, 15:40
3 ответа

Вы могли сделать что-то вдоль этих строк:

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 команда. Файл должен быть файлом обычного текста.

2
27.01.2020, 20:43
  • 1
    Ничего себе. Мой сингл ex команда почти в три раза медленнее, чем это, даже на 267-байтовом файле. –  l0b0 07.06.2013, 15:27
  • 2
    я думаю ex не решение, оно должно считать целый файл, прежде чем выполнят команду. –  cuonglm 07.06.2013, 15:29
  • 3
    @l0b0, для такого короткого файла, различие только будет из-за времени загрузки утилит. Отметьте это ex должен будет считать целый файл, но не сохранить целое содержание в памяти (хотя это должно будет все еще сохранить изрядный объем информации в памяти). YMMV в зависимости от ex реализация. –  Stéphane Chazelas 07.06.2013, 15:39
  • 4
    Несомненно, я был просто удивлен что время запуска ex (читая файл), был намного больше, чем объединенное время запуска tac, awk и dd плюс подоболочка. –  l0b0 07.06.2013, 16:04
  • 5
    PS: Работы с GNU awk 3.1.4, но не с mawk 1.2. Никакой вывод и никакие изменения в файле. –  l0b0 07.06.2013, 16:27

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 }
0
27.01.2020, 20:43
  • 1
    Это, кажется, просто помещает текст незадолго до последнего блока комментария, который не является требуемой функцией. Например, что, если существует несколько блоков комментария, разделенных пустыми строками? Это также, кажется, не обрабатывает пробел перед символами комментария. –  l0b0 07.06.2013, 22:49
  • 2
    я испытываю затруднения для понимания спецификации нижнего колонтитула. Извините за это. Если нижний колонтитул является "последовательностью нуля или большего количества белых строк, сопровождаемых одной или несколькими строками комментария", я изменил свой ответ для лучше соответствия спецификациям. Но возможно нижний колонтитул мог быть сделан из нескольких комментариев, смешанных с несколькими пустыми строками? –  Sylvain Leroux 08.06.2013, 17:33

Это - конфигурационный файл, таким образом, он подходит удобно к памяти. Нет никакой потребности обработать его как поток.

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
-1
27.01.2020, 20:43

Теги

Похожие вопросы