LinuxForum.Fans
Тема

Sed скрипт замена первой строки во вхождении

Автор: aivs 12 сообщений 3671 просмотров
#186885

Пишу небольшую программку на gtkdialog+bash, и нужно внести изменения в /etc/resolv.conf
С помощью sed нужно в resolv.conf найти все строки начинающиеся с nameserver и только третью найденную заменить на nameserver 123.123.123.123
Уже полдня бьюсь, но написал вариант, который меняет все найденные строки

text
sed -e 's/^[^#]*nameserver.*/nameserver 123.123.123.123/' /etc/resolv.conf

[console][aivs@myhost ~]$ sed -e 's/^[^#]*nameserver.*/nameserver 123.123.123.123/' /etc/resolv.conf
# Generated by dhcpcd from eth0
# /etc/resolv.conf.head can replace this line
nameserver 123.123.123.123
nameserver 123.123.123.123
nameserver 123.123.123.123
# /etc/resolv.conf.tail can replace this line
[/console]

результат должен быть записан в resolv.conf

#186910

Подскажите учебник по sed!

#186914
aivs написал:
Подскажите учебник по sed!

рекомендовать ничего не могу, но из того, что видел: http://drbatty.ru/sed/
собственно по поводу проблемы - ждите его автора...

#186953

[console]ksu@ksu:~$ cat z.txt
# Generated by dhcpcd from eth0
# /etc/resolv.conf.head can replace this line
nameserver 123.123.123.123
ff
nameserver 123.123.123.123
;dfl;dfl
;'fd;fd;

nameserver 123.123.123.123
# /etc/resolv.conf.tail can replace this line
ksu@ksu:~$ sed -r '/^nameserver/{H;x;/(\n.*){3}/{x;s/.*/nameserver 1.2.3.4/;x;};x}' z.txt
# Generated by dhcpcd from eth0
# /etc/resolv.conf.head can replace this line
nameserver 123.123.123.123
ff
nameserver 123.123.123.123
;dfl;dfl
;'fd;fd;

nameserver 1.2.3.4
# /etc/resolv.conf.tail can replace this line
[/console]

#186955
text
sed -r '
/^nameserver/{
  H
  x
  /(\n.*){3}/{
    x
    s/.*/nameserver 1.2.3.4/
    x
  }
  x
}
' z.txt

так наверное понятнее будет...
идея в том, что я сохраняю все ключевые строчки, и когда приходит третья, то я её заменяю.

#186965

Пытаюсь записать в файл, но ничего не происходит.

sudo sed -i '/^nameserver/{H;x;/(\n.*){3}/{x;s/.*/nameserver 1.2.3.6/;x;};x}' /etc/resolv.conf

Подставляя {3} номера других строк - 2,1 поведение не то, что я ожидаю.
Как также первую и вторую строку обработать ??

И как вместо замены сделать удаление строки ?

#187001

удаление d
что вы ожидаете я не знаю, что получается не вижу .

#187003

ключ -r забыли

#187052

Если не сложно объясните как в этом скрипте задать номер строки для изменения, мне нужно изменить три строки не по очереди.

Вот так у меня не получилось в файл записать

text
sudo sed -ir '/^nameserver/{H;x;/(\n.*){3}/{x;s/.*/nameserver 1.2.3.6/;x;};x}' /etc/resolv.conf

Удалить так ?

text
sudo sed -ir '/^nameserver/{H;x;/(\n.*){3}/{x;d;x;};x}' /etc/resolv.conf
#187100

aivs, скопируйте файл в свой каталог, и пробуйте без sudo и -i. а что непонятно - спрашивайте.

#187103

"неполучилось" - я не понимаю. Если не сказать грубее.

#187954

Со всем разобрался, все получилось, спасибо!

Войдите или зарегистрируйтесь, чтобы ответить.