Заменить серийный номер в файлах зоны на sed - PullRequest
3 голосов
/ 17 декабря 2009

Мне нужно заменить сериалы в файлах зон, и я подумал, что проще всего использовать 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/, выглядит следующим образом. На повторном языке это регулярное выражение, которое я получил, соответствует только одной строке.

\s*[0-9]<em>\s</em>;\s*serial

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

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

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

Ответы [ 5 ]

2 голосов
/ 17 декабря 2009

Похоже, вам нужна звездочка после второго "\ 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", поскольку у вас, вероятно, не будет нескольких вхождений в одной строке.

1 голос
/ 29 октября 2011

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

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

Сохранить ведущие пробелы.

1 голос
/ 17 декабря 2009

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

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

Result1

@ 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 цифр.

0 голосов
/ 17 декабря 2009
awk -F"," '/serial$/{$0="20091218 ; serial"}1' OFS="," file
0 голосов
/ 17 декабря 2009

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

sed -i 's/\s*[0-9]\+\s;\s*serial/20091218 ; serial/g' *.zone && cat *.zone
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...