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 ???
ну например так:
sed -n '/^[^#]*address=/ ! d; s/.*=//p' /etc/rc.conf
Если можно прокомментировать, учу sed
Кключ -n означает, что выводиться будет только то, что мы явно скажем вывести.
Между / и / находится регулярное выражение, с которым сверяются все строки.
! значит, что выбраны будут строки, которые с ним НЕ совпадают.
d значит, что выбранные строки будут удалены (из дальнейшей обработки).

^*address= значит, что от начала (^) каждой строки будет искаться подстрока "address=", перед которыми может быть любое количество, от нуля и больше (*), любых символов, кроме символа #

После этого в найденном будет проведена замена (s/что-то/на что-то/) любых символов (.) в любом количестве от нуля и больше (*) заканчивающийся знаком = на пустую строку.
Получившиеся в результате замены строки будут отправляться на вывод (p).
/^*address=/ ! d
выполнить команду d (удалить строку) для строк соответствующих (а так как перед командой стоит !, то для всех строк кроме) конструкции ^*address=

^*address=
в начале строки ( ^ ) до address= идут любые символы кроме # ( ) в любом количестве ( * ). Этим мы пытаемся учесть, что знак решетки может стоять не только сначала, но и после табуляции, пробела. Хотя, правильнее было бы использовать ^*address= но и эта конструкция не учитывает возможность того, что в rc.conf можно задавать по нескольку переменных в строке.

; s/.*=//p
точка с запятой отделяет команду s от d. Тоесть с оставшимися строками (теми которые содержат address=) мы проводим операцию замены любых символов ( . ) в любом количестве ( * ), включая знак = на пустоту, и результат выводим.

PS. Опоздал. Natrio как всегда опередил.
Это понял, а может ли sed найти строку и заменить ее на образец, думал как то так:
sudo sed -i '/s/address=*/address=192.168.1.101/' /etc/rc.conf
но эффект совершенно не тот, что я ожидал.

Нужно найти строку начинающуюся с address=* и заменить ее на address=192.168.1.101 в файле.
. имеет специальный смысл для sed - любой символ. Поэтому ее надо экранировать, т.е. писать \.

sudo sed -i 's/address=.*/address=192\.168\.1\.101/' /etc/rc.conf
вместо экранирование можно с строгие кавычки брать ‘ ’ ?
И у меня проблема был, что я точку не поставил перед звездочкой, что она значит ?
С переменной работает
sudo sed -i "s/^[^#]*address=.*/address=$IP/" /etc/rc.conf
Вот думаю конечный вариант, комментарии пропускаем, а паттерн берем из переменной.
Спасибо большое, в разработках выложил скрипт с gtk интерфейсом для настройки сети, завтра добавлю dns!!
Строго говоря да.
s/blabla/bla.bla/ - нормально, а
s/bla.bla/blabla/ - не гуд, так как заменит и “bla.bla”, и “bla1bla”, и “blaWbla”….
кавычки помогут, но в твоем варианте можно и без них

То, что в предыдущем варианте ты использовал address=* означало, что заменяются строки вида
address=, address==, address===, т.е. последний символ перед *, а это было =, мог повторятся любое число раз. Точка означает любой символ, значит, .* набор любых символов
 
Зарегистрироваться или войдите чтобы оставить сообщение.