pavement

Sed

From FreeBSDwiki
(Difference between revisions)
Jump to: navigation, search
m (more links and delimiter info)
(add mention of the -i argument)
Line 5: Line 5:
 
The most common usage is to change all instances of a phrase to another; to wit:
 
The most common usage is to change all instances of a phrase to another; to wit:
  
  dave@samizdata:~% cat sed_testfile
+
  dave@samizdata:~% '''cat sed_testfile'''
 
   dave
 
   dave
 
   dave
 
   dave
Line 12: Line 12:
 
   dave
 
   dave
 
   freebsd
 
   freebsd
  dave@samizdata:~% sed s/dave/david/ sed_testfile
+
  dave@samizdata:~% '''sed s/dave/david/ sed_testfile'''
 
   david
 
   david
 
   david
 
   david
Line 19: Line 19:
 
   david
 
   david
 
   freebsd
 
   freebsd
  dave@samizdata:~% more sed_testfile
+
  dave@samizdata:~% '''more sed_testfile'''
 
   dave
 
   dave
 
   dave
 
   dave
Line 30: Line 30:
 
As you can see, the changes were not actually made to the file. I didn't tell it to put the  changes anywhere! Easily fixed with the help of [[redirection]]:
 
As you can see, the changes were not actually made to the file. I didn't tell it to put the  changes anywhere! Easily fixed with the help of [[redirection]]:
  
  dave@samizdata:~% sed s/dave/david/ sed_testfile > sed_testfile_new
+
  dave@samizdata:~% '''sed s/dave/david/ sed_testfile > sed_testfile_new'''
  dave@samizdata:~% more sed_testfile_new
+
  dave@samizdata:~% '''more sed_testfile_new'''
 
   david
 
   david
 
   david
 
   david
Line 46: Line 46:
 
To give you another example of how useful [[sed]] can be, let's say that you have a DHCP server and want to change a whole segment's range:
 
To give you another example of how useful [[sed]] can be, let's say that you have a DHCP server and want to change a whole segment's range:
  
  samizdata# sed s/10.1.0./10.2.0./ dhcpd.conf > new_dhcpd.conf
+
  samizdata# '''sed s/10.1.0./10.2.0./ dhcpd.conf > new_dhcpd.conf'''
  
 
Will give you a new_dhcpd.conf file with the changes made. You'll want to check the file by hand to make sure that the changes are correct, but you just saved yourself a lot of typing :)
 
Will give you a new_dhcpd.conf file with the changes made. You'll want to check the file by hand to make sure that the changes are correct, but you just saved yourself a lot of typing :)
 +
 +
Another option for using sed is to have it make changes in place, but save the original version of the file(s) with a suffix (like .bak) added, using the -i argument.  For example:
 +
 +
samizdata# '''sed -i .bak s/10.1.0./10.2.0./ dhcpd.conf'''
 +
samizdata# '''ls | grep dhcpd'''
 +
dhcpd.conf
 +
dhcpd.conf.bak
  
 
Note that the standard delimiter is "/" but it can be just about anything; %, _, even commas. So changing a file with lots of forward-slashes (/) can be as ugly as
 
Note that the standard delimiter is "/" but it can be just about anything; %, _, even commas. So changing a file with lots of forward-slashes (/) can be as ugly as

Revision as of 16:44, 24 February 2006

Short for "Streamline Editor", sed allows you to run a file through it and either match or change data without actually editing the file itself. This can be particularly handy if you need to make a lot of similar changes to a file -- e.g., you find out you consistently put in a wrong hostname in a configuration file, and you need to change your conf file to point to the right server....except the same change needs to be made 100 times. sed to the rescue.

Note that the change will only happen on the first instance of the phrase in each line.

The most common usage is to change all instances of a phrase to another; to wit:

dave@samizdata:~% cat sed_testfile
 dave
 dave
 davedave
 jimbo
 dave
 freebsd
dave@samizdata:~% sed s/dave/david/ sed_testfile
 david
 david
 daviddave
 jimbo
 david
 freebsd
dave@samizdata:~% more sed_testfile
 dave
 dave
 davedave
 jimbo
 dave
 freebsd
dave@samizdata:~%

As you can see, the changes were not actually made to the file. I didn't tell it to put the changes anywhere! Easily fixed with the help of redirection:

dave@samizdata:~% sed s/dave/david/ sed_testfile > sed_testfile_new
dave@samizdata:~% more sed_testfile_new
 david
 david
 daviddave
 jimbo
 david
 freebsd
dave@samizdata:~%

You'll also note that it only changed the first instance of the word per line; to change all instances on each line, you'll want to use the "g" modifier (to make global switches) like this:

dave@samizdata:~% sed s/dave/david/g sed_testfile > sed_testfile_new

See the man page for more details.

To give you another example of how useful sed can be, let's say that you have a DHCP server and want to change a whole segment's range:

samizdata# sed s/10.1.0./10.2.0./ dhcpd.conf > new_dhcpd.conf

Will give you a new_dhcpd.conf file with the changes made. You'll want to check the file by hand to make sure that the changes are correct, but you just saved yourself a lot of typing :)

Another option for using sed is to have it make changes in place, but save the original version of the file(s) with a suffix (like .bak) added, using the -i argument. For example:

samizdata# sed -i .bak s/10.1.0./10.2.0./ dhcpd.conf
samizdata# ls | grep dhcpd
dhcpd.conf
dhcpd.conf.bak

Note that the standard delimiter is "/" but it can be just about anything; %, _, even commas. So changing a file with lots of forward-slashes (/) can be as ugly as

> sed s/\/dev\/am0/\/dev\/gm0/g example.fstab > example.fstab.new

or as simple as

> sed s%/dev/am0%/dev/gm0%g example.fstab > example.fstab.new

For more info, check out these pages: http://www.student.northpark.edu/pemente/sed/ http://www.faqs.org/faqs/editor-faq/sed/ http://www.grymoire.com/Unix/Sed.html

Personal tools