Sed: Find and Replace The Whole Line [ Regex ]

Posted on in Categories , , last updated December 14, 2012

I have a line as follows in squid.conf file. My sever is hosted in a cloud:

acl verizonfios src 1.2.3.4

My ISP will force an IP address change every week or two. I would like to replace them with a new IP

acl verizonfios src 4.5.6.7

How do I replace the line starting with “acl verizonfios” with new IP address using sed and ssh?


The sed syntax is as follows to match the line starting with “acl verizonfios” and replace the whole line:

sed -i 's/find/replace/' file
sed -i 's/^acl verizonfios.*/acl verizonfios src 4.5.6.7/' file

In this example, replace an IP address with 202.1.2.3:

sed -i 's/^acl verizonfios.*/acl verizonfios src 202.1.2.3/' /etc/squid/squid.conf

You can execute the sed command using ssh:

ssh root@your.server.at.cloud sed -i 's/^acl verizonfios.*/acl verizonfios src 202.1.2.3/' /etc/squid/squid.conf
ssh root@your.server.at.cloud /usr/sbin/squid -k reconfigure

Sample shell script

#!/bin/bash
# Author: nixCraft <www.cyberciti.biz> - GPL v2.x+
# -------------------------------------------------
 
## cloud server name ##
_rserver="your.server.at.cloud"
_ruser="root"
 
## Get your public IP ##
_myip="$(/bin/curl ifconfig.me)"
_cmd1="/bin/sed -i 's/^acl verizonfios.*/acl verizonfios src ${_myip}/' /etc/squid/squid.conf"
_cmd2="/usr/sbin/squid -k reconfigure"
 
## connect to the remote box 
## update the proxy server 
## reload the proxy server
/bin/ssh ${_ruser}@${_rserver} "$_cmd1"
/bin/ssh ${_ruser}@${_rserver} "$_cmd2"

Posted by: Vivek Gite

The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on Twitter, Facebook, Google+.

Share this on (or read 2 comments/add one below):

2 comment

  1. I wanted to change the name of my raspberrypi hostname in a conf file, but the above example did not work for me (it inserted the new name at the beginning, but left the old name, too)

    Here is the command I ended up using:

    sed -i “/^host =/c\host = myrpi” inputs_test.conf

    this changed:

    host = raspberrypi

    to

    host = myrpi

Leave a Comment