Добавление строки с использованием sed - PullRequest
0 голосов
/ 21 мая 2018

Не могу найти правильный способ сделать это, несмотря на проверку моего регулярного выражения в reg checker.

Учитывая текстовый файл, содержащий, среди прочего, эту запись:

zone    "example.net"    {
        type master;
        file "/etc/bind/zones/db.example.net";
        allow-transfer { x.x.x.x;y.y.y.y; };
        also-notify { x.x.x.x;y.y.y.y; };
};

Я хочу добавить строки после строки уведомлений, специально для этого домена.

Поэтому, используя эту командную строку sed:

sed '/"example\.net".*?also-notify.*?};/a\nxxxxxxx/s' named.conf.local

Я подумал, что должно работать, чтобы добавить 'xxxxxxx'после линии.Но нет.Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

В POSIX sed вы можете использовать команду a для добавления с экранированной литеральной новой строкой:

$ sed  '/^[[:blank:]]*also-notify/ a\
NEW LINE' file

В GNU sed a несколько более естественна, поскольку предполагается новая строка:

$ gsed  '/^[[:blank:]]*also-notify/ a NEW LINE' file

Проблема с sed в вашем примере имеет две стороны.

Во-первых, любое sed регулярное выражение не может быть для многострочного совпадения, как в example\.net".*?also-notify.*?.Это больше соответствует типу Perl.Вам потребуется использовать оператор диапазона для запуска, как в:

$ sed  '/"example\.net/,/also-notify/{
       /^[[:blank:]]*also-notify/ a\
    NEW LINE 
    }' file

Вторая проблема - это \n в прилагаемом тексте.С POSIX sed \n не поддерживается ни в одном контексте.В GNU sed предполагается новая строка, а \n находится вне контекста (если сразу после a) и интерпретируется как экранированный литерал n.Вы можете использовать \n с GNU sed после 1 символа, но не сразу после.В POSIX sed ведущие пробелы добавленной строки всегда удаляются.

0 голосов
/ 21 мая 2018

Ты уже довольно близко.Просто используйте диапазон (/pattern/,/pattern/{ #commands }), чтобы выбрать текст, с которым вы хотите работать, а затем используйте /pattern/a/\ ..., чтобы добавить нужную строку.

/"example\.net"/,/also-notify/{
/also-notify/a\
\        this is the text I want to add.
}

sed обрезает начальный пробел в тексте, который будет добавлен.Добавление обратной косой черты \ в начале строки предотвращает это.

В Bash это будет выглядеть примерно так:

sed -e '/"example\.net"/,/also-notify/{
  /also-notify/a\
  \        this is the text I want to add.
  }' named.conf.local

Также обратите внимание, что sed использует более старый диалект обычного языка.выражения, которые не поддерживают нежадные количественные выражения, такие как *?.

0 голосов
/ 21 мая 2018

После awk может помочь в этом.

awk -v new_lines="new_line here" '/also-notify/{flag=1;print new_lines} /^};/{flag=""} !flag'  Input_file

Если вы хотите отредактировать сам файл Input_file, тогда добавьте > temp_file && mv temp_file Input_file к вышеуказанному коду.Также print new_lines здесь new_lines - это переменная, в которой вы можете также напрямую печатать новые залоговые права.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...