Заменить целые строки в файле .conf

У меня есть ситуация, когда я хочу, чтобы скрипт bash заменил целые строки в dnsmasq.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

Я вызываю bash как ./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?


person ogs    schedule 08.01.2015    source источник


Ответы (2)


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

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

i.e.

  • использование двойных кавычек вместо одинарных, чтобы позволить переменным расширяться
  • использование нескольких подстановочных команд в одиночном sed вместо многократного вызова sed
  • использование -i.bak для сохранения исходного файла с расширением .bak
person anubhava    schedule 08.01.2015

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

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
person Amit Verma    schedule 08.01.2015