sed swap command examples

Summary: This post shares some Unix/Linux sed command swap/replace examples, where you replace one string or regular expression with another string.

Here's the source code for a sed script that I used to convert some poorly formatted HTML into a format that I preferred. I ran this on a set of almost 30 JSP files from an open source project I recently worked on. The good news is that the previous format of the files was consistent, so I was able to use this sed script to convert all the files at once.

Most of the reformatting lines in the sed script have comments describing what they do, so I won't get into any other detail here. Here is the sed script:

# convert tabs to two spaces
s/      /  /g

# delete leading whitespace (spaces, tabs) from front of each line
# aligns all text flush left
s/^[    ]*//

# add a newline
s?<p>\*?\
<p>\*?

# put table tag on newline
s?<table?\
<table?

# get rid of newline?
s/<tr>*\n/<tr>/

s/<tr>/  <tr>/

# put </tr> on a newline
s?<\/tr>?\
  </tr>?

# put <td> on a newline
s/<td>/\
    <td>/g
s/<td /\
    <td /g

# put leading spaces before closing td tag
s?^</td?    </td?

# put on a newline
s?<h:selectOneListbox?\
    <h:selectOneListbox?

s?^<h:selectManyCheckbox?    <h:selectManyCheckbox?

#s?<h:message?    <h:message?

# get rid of those pesky colons
s?:</td?</td?
s?:  (? (?

# add leading spaces
s?<f:?    <f:?
s?</h?    </h?

s?^[    ]*<f:view?<f:view?
s?^<h:commandButton?    <h:commandButton?
s?^<input?    <input?

s?^[    ]*</html>?</html>?

s?[     ]*</h3>?</h3>?

# add the class tag
s?^  <tr>\n    <td>?  <tr>\
    <td class="data_label">?

Some of those sed commands are a little advanced, but I hope you'll be able to figure out what they do. If not, try following this link to the sed man page, or look at some of the other sed posts I have out here.

The shell script I used to run the sed script

I used a Bourne shell script to run my sed script. I used the shell script to help me run these sed commands against every JSP file (*.jsp) in the current directory, converting the HTML of each file. Here's the shell script I used:

#!/bin/sh

for i in `ls *.jsp`
do
  echo "Editing $i ..."
  sed -f pp.sed < $i  > $i.tmp
  mv $i.tmp $i
done

I've described this shell script in another blog post, so just follow that link to learn more about how it works.