Q. How do I use sed for selective deletion of certain lines? I have text as follows in file:
Line 1
Line 2
WORD1
Line3
Line 4
WORD2
Line5
I would like to delete all lines between WORD1 and WORD2 to produce final output:
Line 1
Line 2
Line5
A. For selective deletion of certain lines sed is the best tool. To print all of file EXCEPT section between WORD1 and WORD2 (2 regular expressions), use
$ sed '/WORD1/,/WORD2/d' input.txt > output.txt
Shell script to remove Javascript code
Here is my small script that reads all *.html files and removes javascript (script download link).
#!/bin/bash # ALL HTML FILES FILES="*.html" # for loop read each file for f in $FILES do INF="$f" OUTF="$f.out.tmp" # replace javascript sed '/<script type="text\/javascript"/,/<\/script>/d' $INF > $OUTF /bin/cp $OUTF $INF /bin/rm -f $OUTF done
Above shell script removes all occurrence of javascript.
Featured Articles:
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- My 10 UNIX Command Line Mistakes
- The Novice Guide To Buying A Linux Laptop

- 10 Tools To Add Some Spice To Your UNIX Shell Scripts
- Email FAQ to a friend
- Download PDF version
- Printable version
- Comment RSS feed
- Last Updated: 04/12/08

Sign up for our daily email newsletter:
{ 5 comments… read them below or add one }
but the command
sed -e ‘/word1/,/word2/d’ deletes the whole line in case the given text is like this :
unix word1 java word2
if the text between word1 and word2 only is to be deleted then this is not the solution. Can I get some help on this aspect…. thnks in advance
How can i make the script to look in subfolders?
How to delete following line from a xml file.
#vi package.xml
drivers-3.6.1-${release}.${arch}.rpm
..
..
#
I tried sed -e ‘/drivers-3.6.1-${release}.${arch}.rpm /d’ /root/package.xml > /root/output.txt
tannu: you can also use “grep -v”
As for people asking Sam’s question (11.27.07), the problem is two fold. One, using sed’s pattern matching with the “d” (delete) clobbers whole lines, as you noted. The solution would seem to to use the “s” (substitute) form instead:
sed 's/WORD1.*WORD2//g' input.txtBUT then you discover the larger problem: sed by default does all it’s processing one line at a time (e.g., it fills it’s processing buffer up to each ‘\n’ it encounters).
The formal approaches include using sed’s “hold space” and “pattern space” commands, N, H/h,G/g,x as hinted here:
http://www.gnu.org/software/sed/manual/html_node/Other-Commands.html
I used that route in an email formatting script, but these days if i can get away with quick’n'dirty, i try to just strip all occurrences of ‘\n’ from the stream you give sed like this:
cat input.txt | tr -d '\n' | sed 's/WORD1.*WORD2//g'No files i’ve worked on are big enough to blow sed’s buffer so far.