2015-01-08 6 views
1

У меня есть ситуации, где я хочу Баш скрипт для замены целой строки в dnsmasq.confЗаменить целые строки в файле .conf

По умолчанию линии:

listen-address=192.168.42.1 
dhcp-range=192.168.42.1,192.168.42.253,255.255.255.0,192.168.42.255,24h 
dhcp-option=option:router,192.168.42.1 

я реализую :

new_ip=$1 
broadcast=$2 
base_ip=`echo $new_ip | cut -d"." -f1-3` 

sed -i 's/^listen-address.*/listen-address=$new_ip/' /etc/dnsmasq.conf 
sed -i 's/^dhcp-range.*/dhcp-range=$base_ip.1,$base_ip.254,255.255.255.0,$broadcast,24h/' /etc/dnsmasq.conf 
sed -i 's/^dhcp-option.*/dhcp-option=option:router,$new_ip/' /etc/dnsmasq.conf 

Я зову Баш как ./test.sh 172.24.239.40 172.24.239.255 и я получаю следующие строки:

listen-address=$new_ip 
dhcp-range=$base_ip.1,$base_ip.254,255.255.255.0,$broadcast,24h 
dhcp-option=option:router,$new_ip 

Возможно ли отделить параметр от текста в командных командах sed?

ответ

1

Вы можете использовать:

sed -i.bak -e "s/^listen-address.*/listen-address=$new_ip/" \ 
-e "s/^dhcp-range.*/dhcp-range=$base_ip.1,$base_ip.254,255.255.255.0,$broadcast,24h/" \ 
-e "s/^dhcp-option.*/dhcp-option=option:router,$new_ip/" /etc/dnsmasq.conf 

т.е.

  • использование двойных кавычек вместо одинарные кавычки, чтобы переменные расширить
  • использования нескольких команды замены в одной СЭД вместо позвонив по телефону sed несколько раз
  • использование -i.bak для продолжения происхождения л файл безопасная с .bak расширения
+1

Спасибо @anubhava! Он отлично работает – ogs

+0

Добро пожаловать, рад, что все получилось. – anubhava

1

Используйте двойные кавычки вместо одинарных кавычек, когда у вас есть переменные в СЭДЕ:

sed -i "s/^listen-address.*/listen-address=$new_ip/" /etc/dnsmasq.conf 
sed -i "s/^dhcp-range.*/dhcp-range=$base_ip.1,$base_ip.254,255.255.255.0,$broadcast,24h/" /etc/dnsmasq.conf 
sed -i "s/^dhcp-option.*/dhcp-option=option:router,$new_ip/" /etc/dnsmasq.conf