sed вставьте строку на второй последней строке между двумя скобками - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть файл зоны со следующей информацией:

zone "example.com" {
    type master;
    file "master/example.com";
};
zone "example.org" {
    type master;
    file "master/example.org";
};

и так далее.Мне нужно grep example.com и добавить три скобки в скобках.

Я могу получить всю скобку с помощью этого:

sed -n '/zone \"example.com\" {/,/};/p' zones.local

Результат:

zone "example.com" {
        type master;
        file "master/example.com";
};

Мне нужно добавить следующие три строки, чтобы конечный результат выглядел следующим образом:

zone "example.com" {
        type master;
        file "master/example.com";
        key-directory "/etc/bind/keys/example.com";
        inline-signing yes;
        auto-dnssec maintain;
};
zone "example.org" {
        type master;
        file "master/example.org";
};

Но как бы я ни старался, я не могу заставить его работать.Я пробовал это например:

sed -n '/zone \"example.com\" {/,/};/p; $i key-directory "/etc/bind/keys/example.com";' zones.local

Но это добавит ко второй последней строке всего файла, а не ко второй последней из результата первого регулярного выражения.Могу ли я заставить его добавить строку в первом регулярном выражении каким-либо образом?

Я полностью застрял и был бы признателен за помощь!

1 Ответ

0 голосов
/ 28 февраля 2019

Это может работать для вас (GNU sed):

sed '/^zone "example.com" {/{:a;h;n;/^};/!ba;x;s#\S.*#key-directory "/etc/bind/keys/example.com";#p;s/\S.*/inline-signing yes;/p;s/\S.*/auto-dnssec maintain;/p;x}' file

Сосредоточиться на строках файла между one "example.com" { и };, все остальные строки будут напечатаны как обычно.

Когда встречается начало строки zone "example.com" {, сделайте копию с помощью команды h, а затем напечатайте текущую строку и замените ее следующей с помощью команды n.

Если текущая строкастрока не начинается };, повторяйте ее до тех пор, пока не произойдет, а затем переключитесь на последнюю скопированную строку, используя команду x и с помощью команды замены s замените неразрывный текст в конце строки натребуется новый текст и выведите его, отметив флаг p в команде замены.Это сохраняет отступ и эффективно вставляет текст перед закрытием };.

. Повторите вышеуказанное для оставшегося нового текста, который нужно вставить, и, наконец, вернитесь обратно в пространство шаблона и напечатайте его тоже.

...