aivs |
|
Темы:
62
Сообщения:
261
Участник с: 31 октября 2006
|
Написал на sed скриптик, который из /etc/rc.conf извлекает ip адрес:sed -e '/^#/d' /etc/rc.conf | sed -n '/address=/p' | sed -e 's/address=//g' 2) sed -n ‘/address=/p’ # Ищем строку со словом address= 3) sed -e 's/address=//g # Удаляем address=, все что за ним оставляем, т.е. либо ничего, либо ip адрес Вопрос такой, можно ли сделать тоже самое, но без каналов, в один заход для sed ??? |
rdf |
|
Темы:
1
Сообщения:
165
Участник с: 01 мая 2011
|
ну например так:sed -n '/^[^#]*address=/ ! d; s/.*=//p' /etc/rc.conf |
aivs |
|
Темы:
62
Сообщения:
261
Участник с: 31 октября 2006
|
Если можно прокомментировать, учу sed |
Natrio |
|
Темы:
47
Сообщения:
4763
Участник с: 08 января 2011
|
Кключ -n означает, что выводиться будет только то, что мы явно скажем вывести. Между / и / находится регулярное выражение, с которым сверяются все строки. ! значит, что выбраны будут строки, которые с ним НЕ совпадают. d значит, что выбранные строки будут удалены (из дальнейшей обработки). ^*address= значит, что от начала (^) каждой строки будет искаться подстрока "address=", перед которыми может быть любое количество, от нуля и больше (*), любых символов, кроме символа # После этого в найденном будет проведена замена (s/что-то/на что-то/) любых символов (.) в любом количестве от нуля и больше (*) заканчивающийся знаком = на пустую строку. Получившиеся в результате замены строки будут отправляться на вывод (p). |
rdf |
|
Темы:
1
Сообщения:
165
Участник с: 01 мая 2011
|
/^*address=/ ! d выполнить команду d (удалить строку) для строк соответствующих (а так как перед командой стоит !, то для всех строк кроме) конструкции ^*address= ^*address= в начале строки ( ^ ) до address= идут любые символы кроме # ( ) в любом количестве ( * ). Этим мы пытаемся учесть, что знак решетки может стоять не только сначала, но и после табуляции, пробела. Хотя, правильнее было бы использовать ^*address= но и эта конструкция не учитывает возможность того, что в rc.conf можно задавать по нескольку переменных в строке. ; s/.*=//p точка с запятой отделяет команду s от d. Тоесть с оставшимися строками (теми которые содержат address=) мы проводим операцию замены любых символов ( . ) в любом количестве ( * ), включая знак = на пустоту, и результат выводим. PS. Опоздал. Natrio как всегда опередил. |
aivs |
|
Темы:
62
Сообщения:
261
Участник с: 31 октября 2006
|
Это понял, а может ли sed найти строку и заменить ее на образец, думал как то так:sudo sed -i '/s/address=*/address=192.168.1.101/' /etc/rc.conf Нужно найти строку начинающуюся с address=* и заменить ее на address=192.168.1.101 в файле. |
rdf |
|
Темы:
1
Сообщения:
165
Участник с: 01 мая 2011
|
. имеет специальный смысл для sed - любой символ. Поэтому ее надо экранировать, т.е. писать \.sudo sed -i 's/address=.*/address=192\.168\.1\.101/' /etc/rc.conf |
aivs |
|
Темы:
62
Сообщения:
261
Участник с: 31 октября 2006
|
вместо экранирование можно с строгие кавычки брать ‘ ’ ? И у меня проблема был, что я точку не поставил перед звездочкой, что она значит ? С переменной работает sudo sed -i "s/^[^#]*address=.*/address=$IP/" /etc/rc.conf |
aivs |
|
Темы:
62
Сообщения:
261
Участник с: 31 октября 2006
|
Спасибо большое, в разработках выложил скрипт с gtk интерфейсом для настройки сети, завтра добавлю dns!! |
rdf |
|
Темы:
1
Сообщения:
165
Участник с: 01 мая 2011
|
Строго говоря да. s/blabla/bla.bla/ - нормально, а s/bla.bla/blabla/ - не гуд, так как заменит и “bla.bla”, и “bla1bla”, и “blaWbla”…. кавычки помогут, но в твоем варианте можно и без них То, что в предыдущем варианте ты использовал address=* означало, что заменяются строки вида address=, address==, address===, т.е. последний символ перед *, а это было =, мог повторятся любое число раз. Точка означает любой символ, значит, .* набор любых символов |