Замените серийный номер в файлах зоны на sed

Мне нужно заменить серийные номера в моих файлах зоны, и я подумал, что проще всего будет использовать sed, чтобы изменить это. У меня есть следующая строка для тестирования.

@ IN SOA    ns1.domain.com. webdev.domain.com. (
        2006080401  ; serial
        8H      ; refresh
        2H      ; retry
        1W      ; expire
        4h)     ; minimum ttl

        NS  ns1.domain.com.
        NS  ns2.domain.com.
        MX 10   mail1.domain.com.
        MX 20   mail2.domain.com.

domain.com.      A   255.255.255.255
mail1           A   255.255.255.255
mail2           A   10.10.10.10

www         CNAME   domain.com.
ftp         CNAME   www
webmail     CNAME   www

Регулярное выражение, которое я создал с помощью http://rubular.com/, выглядит следующим образом. На rebular это регулярное выражение, которое я получил, соответствует только одной строке.

\s*[0-9]\s;\s*serial

Итак, в sed я бы использовал это следующим образом.

sed -i 's/\s*[0-9]\s;\s*serial/20091218 ; serial/g' *.zone

Моя проблема в том, что это ничего не меняет в файле. Я уже пробовал несколько вещей. Спасибо за вашу помощь


person flazzarini    schedule 17.12.2009    source источник


Ответы (4)


Похоже, вам нужна звездочка после второго "\s"

sed -i 's/\s*[0-9]\s*;\s*serial/20091218 ; serial/' *.zone

И, возможно, не помешает добавить еще пару вещей:

sed -i 's/^\s*[0-9]\s*;\s*serial\s$/20091218 ; serial/' *.zone

Я убрал букву «g», так как у вас, вероятно, не будет нескольких вхождений в одной строке.

person Dennis Williamson    schedule 17.12.2009
comment
нашел мою проблему, на самом деле это была просто старая версия sed и egrep, которую я использовал. Я думал, что регулярное выражение не сильно изменилось с 2003 года :) Спасибо за ваши ответы. - person flazzarini; 17.12.2009

Если вы не заботитесь о сохранении ведущих пробелов, вы можете просто сделать:

awk '/serial/{$1=20091218}1'

Результат1

@ IN SOA    ns1.domain.com.     webdev.domain.com. (
20091218 ; serial
        8H              ; refresh

С другой стороны, если для вас важно, чтобы серийный номер выровнялся, вы можете сделать:

awk '/serial/{printf "%8s%-16s; %s\n"," ",20091218,$3;next}1'

Результат2

@ IN SOA    ns1.domain.com.     webdev.domain.com. (
        20091218        ; serial
        8H              ; refresh

Это будет идеально выстраиваться, если вы сохраните серийный номер менее 16 цифр.

person SiegeX    schedule 17.12.2009
comment
Отличный код, спасибо. Вот версия, которая рекурсивно перемещается по каталогу и заменяет серийный номер в каждом файле: find . -type f -print0 | xargs -0 awk '/serial/{printf "%6s%-18s; %s\n"," ",2014121101,$3;next}1' - person kazy; 11.12.2014

Вот метод Perl, который хорошо сработал для меня:

cat /var/named/zonefile.db | perl -e "while(<>){ s/\d+(\s*;\s*[sS]erial)/20091218\1/; print; }"

Сохраняйте лидирующие пробелы.

person Greg    schedule 29.10.2011

Ваш шаблон sed ищет ровно одну цифру. Это работает для меня:

sed -i 's/\s*[0-9]\+\s;\s*serial/20091218 ; serial/g' *.zone && cat *.zone
person Fritz G. Mehner    schedule 17.12.2009