И точно также нужно удалить например вторую найденную строку, Как ???
Вот так смог изменить нужную строку
sed -e '/^#/d' /etc/resolv.conf | sed -e '1s/nameserver.*/nameserver 123.123/'

Но в файл таким образом не записать
Пытаюсь парсить /etc/resolv.conf, также нужно заменить
nameserver 123.123.123.123 на nameserver 321.321.321.321

Вот написал
 sed -e 's/^[^#]*nameserver.*/nameserver 123.123.123.123/' /etc/resolv.conf
Но этот скрипт заменяет все строки, а мне нужно только первую,

Печать определенной строки нашел как делать:
# печать строки 52
sed -n ‘52p’ # способ 1
sed ‘52!d’ # способ 2
sed ‘52q;d’ # способ 3,
Но как это в мой скрипт засунуть непонял.
Появилась задача настраивать сеть через гуёвое приложение, ни gtk ни qt не знаю, нагуглил gtkdialog, на нем и написал.

Требуется пакет gtkdialog !!


Как работает программа:
Если вы перешли на новый вид оформления настроек сети в /etc/rc.conf, то программа вам подойдет.
Программа парсит rc.conf на наличие строк

  • address=
    netmask=
    gateway=

    Комментарии обходит, найдя строки, показывает их значения.
    Параметры записываются в rc.conf (используется sudo, в консоли спросит пароль).
    Если нажали “Автоматически”, то после нажатия Сохранить, в rc.conf параметры сотрутся (это требуется для dhcp настройки).

    При заполнении полей DNS, программа перезаписывает /etc/resolv.conf, если вы очистили все поля, и у вас выбран режим статической настройки, то resolv.conf не изменится (защита от случаяного стирания). Когда вы выбираете Автоматическую (DHCP) настройку, файл resolv.conf вообще не трогается, т.к. после перезапуска сети, он все равно перезапишется.

    После нажатия на кнопку “Сохранить” все параметры записываются в rc.conf и resolv.conf и перезапускается сеть (/etc/rc.d/network restart)!!!

    Вот сам скрипт:

    #!/bin/bash
    #archnetcfg by aivs from archlinux.org.ru
    export MAIN_DIALOG='
    <window title="Сетевые настройки" resizable="false">
    <vbox>
     <radiobutton active="false">
      <label>Автоматическая настройка</label>
      <variable>RADIOBUTTON2</variable>
      <action>Disable:IP</action>
      <action>Disable:NETMASK</action>
      <action>Disable:GATEWAY</action>
      <action>Disable:DNS1</action>
      <action>Disable:DNS2</action>
      <action>Disable:DNS3</action>
     </radiobutton>
     
     <radiobutton active="true">
      <label>Ручная настройка</label>
      <variable>RADIOBUTTON1</variable>
      <action>Enable:IP</action>
      <action>Enable:NETMASK</action>
      <action>Enable:GATEWAY</action>
      <action>Enable:DNS1</action> 
      <action>Enable:DNS2</action>
      <action>Enable:DNS3</action>
     </radiobutton>
     
     
     <hbox>
     <text>
      <label>IP адрес</label>
     </text>
     <entry>
      <input>sed -n "/^[^#]*address=/ ! d; s/.*=//p" /etc/rc.conf</input>
      <variable>IP</variable>
     </entry>
     </hbox>
     
     <hbox>
     <text>
      <label>Маска сети</label>
     </text>
     <entry>
      <input>sed -n "/^[^#]*netmask=/ ! d; s/.*=//p" /etc/rc.conf</input>
      <variable>NETMASK</variable>
     </entry>
     </hbox>
     
     <hbox>
     <text>
      <label>Шлюз</label>
     </text>
     <entry>
      <input>sed -n "/^[^#]*gateway=/ ! d; s/.*=//p" /etc/rc.conf</input>
      <variable>GATEWAY</variable>
     </entry>
     </hbox>
     
     <hbox>
     <text>
      <label>DNS1</label>
     </text>
     <entry>
      <input>sed -e '/^#/d' /etc/resolv.conf | sed -n '1p'| sed -e "s/nameserver //g"</input>
      <variable>DNS1</variable>
     </entry>
     </hbox>
     
     <hbox>
     <text>
      <label>DNS2</label>
     </text>
     <entry>
      <input>sed -e '/^#/d' /etc/resolv.conf | sed -n '2p'| sed -e "s/nameserver //g"</input>
      <variable>DNS2</variable>
     </entry>
     </hbox>
     <hbox>
     <text>
      <label>DNS3</label>
     </text>
     <entry>
      <input>sed -e '/^#/d' /etc/resolv.conf | sed -n '3p'| sed -e "s/nameserver //g"</input>
      <variable>DNS3</variable>
     </entry>
     </hbox>
     <hbox>
      <button>
      <label>Сохранить</label>
      <action> [ "$RADIOBUTTON2" = "true" ] &&  sudo sed -i 's/^[^#]*address=.*/address=/' /etc/rc.conf</action>
      <action> [ "$RADIOBUTTON2" = "true" ] &&  sudo sed -i 's/^[^#]*netmask=.*/netmask=/' /etc/rc.conf</action>
      <action> [ "$RADIOBUTTON2" = "true" ] &&  sudo sed -i 's/^[^#]*gateway=.*/gateway=/' /etc/rc.conf</action>
      <action> [ "$RADIOBUTTON2" = "true" ] &&  sudo /etc/rc.d/network restart &</action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  sudo sed -i "s/^[^#]*address=.*/address=$IP/" /etc/rc.conf</action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  sudo sed -i "s/^[^#]*netmask=.*/netmask=$NETMASK/" /etc/rc.conf</action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  sudo sed -i "s/^[^#]*gateway=.*/gateway=$GATEWAY/" /etc/rc.conf</action>
      <action> [ -n "$DNS1" ] || [ -n "$DNS2" ] || [ -n "$DNS3" ] && echo "#Generated by archnetcfg.sh" | sudo tee /etc/resolv.conf</action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  [ -n "$DNS1" ] && echo "nameserver $DNS1" | sudo tee -a /etc/resolv.conf </action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  [ -z "$DNS1" ] && : </action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  [ -n "$DNS2" ] && echo "nameserver $DNS2" | sudo tee -a /etc/resolv.conf </action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  [ -z "$DNS2" ] && : </action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  [ -n "$DNS3" ] && echo "nameserver $DNS3" | sudo tee -a /etc/resolv.conf </action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  [ -z "$DNS3" ] && : </action>
      <action> [ "$RADIOBUTTON1" = "true" ] &&  sudo /etc/rc.d/network restart &</action>
      <action type="exit">OK</action>
      </button>
      <button cancel>
      <label>Отменить</label>
      </button>
     </hbox>
    </vbox>
    </window>
    '
    gtkdialog --program=MAIN_DIALOG
Спасибо большое, в разработках выложил скрипт с gtk интерфейсом для настройки сети, завтра добавлю dns!!
вместо экранирование можно с строгие кавычки брать ‘ ’ ?
И у меня проблема был, что я точку не поставил перед звездочкой, что она значит ?
С переменной работает
sudo sed -i "s/^[^#]*address=.*/address=$IP/" /etc/rc.conf
Вот думаю конечный вариант, комментарии пропускаем, а паттерн берем из переменной.
Это понял, а может ли sed найти строку и заменить ее на образец, думал как то так:
sudo sed -i '/s/address=*/address=192.168.1.101/' /etc/rc.conf
но эффект совершенно не тот, что я ожидал.

Нужно найти строку начинающуюся с address=* и заменить ее на address=192.168.1.101 в файле.
Если можно прокомментировать, учу sed
Написал на sed скриптик, который из /etc/rc.conf извлекает ip адрес:
sed -e '/^#/d' /etc/rc.conf | sed -n '/address=/p' | sed -e 's/address=//g'
1) sed -e ‘/^#/d’ /etc/rc.conf # Удаляем строки-комментарии
2) sed -n ‘/address=/p’ # Ищем строку со словом address=
3) sed -e 's/address=//g # Удаляем address=, все что за ним оставляем, т.е. либо ничего, либо ip адрес

Вопрос такой, можно ли сделать тоже самое, но без каналов, в один заход для sed ???
Требуется написать Gui программу для настройки сети.
Суть проста, человек вводит данные, нажимает кнопку сохранить, и это сохраняется в /etc/rc.conf
На qt накидал формочку, но как написать программу не знаю. Опыта программирования на qt нет.

Если кто поможет с программирование, буду рад!

По сути код всей программы закладывается в кнопку сохранить, которая берет данные из полей и записывает их в /etc/rc.conf в нужное место