In a previous blog post I demonstrated how to use the 'sed' command to insert text before or after a line in many files, and in this example I’ll show how to delete a range of lines using the sed
command.
sed delete: How to delete a range of lines using sed
The problem I had today was that I just re-generated 99 HTML files for my Introduction to Unix/Linux tutorial using Latex2HTML, and it generates a bunch of “junk” in my HTML files that looks like this:
<a name="CHILD_LINKS"></a> <ul> <li><a name="tex2html5" href="node1.shtml">Contents</a> <li><a name="tex2html6" href="node2.shtml">Introduction</a> // // this goes on for a long, long time ... // // it finally ends with this line: <!--End of Table of Child-Links-->
Knowing that I want to delete this entire range of lines in all my generated HTML files, I used the following sed
script to delete the range of lines, using this one sed
command:
/\<!--Table of Child-Links-->/,/<!--End of Table of Child-Links-->/d
With this sed
command, I start deleting lines in each file when I saw the first line pattern:
<!--Table of Child-Links-->
and then I stop deleting lines after seeing the ending line pattern:
<!--End of Table of Child-Links-->
Before running this sed
command at all, I of course made a backup of all my files.
Then, after making that backup, I saved my sed
command to a file named changes.sed:
/\<!--Table of Child-Links-->/,/<!--End of Table of Child-Links-->/d
As mentioned in my earlier article, I then tested my change by running the following command, and then visually verifying the output:
sed -f changes.sed < node2.shtml | more
A Linux shell script to change all the files with sed
Once I was sure that my sed
command had properly deleted the range of lines in that test case, I wrote a simple Linux shell script to run the sed
command on every “node*.html” file in the current directory, like this:
# change all the "node*.html" files in the current directory for i in `ls node*html` do echo "working on $i ..." sed -f changes.sed < $i > ${i}.tmp mv ${i}.tmp $i done
I saved this shell script to a file named go.sh, and then ran it like this:
sh go.sh
After my shell script ran, I checked some of my files, and verified that the sed
script/command had successfully deleted that range of lines in all 99 files. The sed
script worked fine, deleting the range of lines as desired, and life is good.