Joe DeRose
Joe DeRose

Reputation: 3558

Trying to Delete Certain Lines in a Range Using sed

In a large file, I need to edit text and remove comments inside a particular range. For this simplified example, let's assume the range begins with _start_ and finishes at _end_.

I'm able to edit the text with no problem using a command like:

sed -i -r "/_start_/,/_end_/ s/SearchText/ReplaceText/" FileName

Please note the following (and let me know, of course, if any of my statements are inaccurate or misguided):

That command above is doing exactly what I expect it to do. So I moved on to the second step of my process: a very similar command to remove comment lines within this range:

sed -i -r "/_start_/,/_end_/ /^#/ d" FileName

This, however, is having no effect: The lines that begin with # are not removed. Indeed, when I execute this command alone, absolutely nothing in my file is changed or deleted -- neither inside the range nor elsewhere.

In my searches on this site and elsewhere, I've found a lot of instructions on deleting lines using sed (instructions that I think I'm following correctly) -- but nothing about a failure such as I'm experiencing.

Can anyone advise me what I'm doing wrong here?

I'm very new to the UNIX/Linux environment, so I'm definitely open to alternate suggestions as to how to handle the issue. But just to satisfy my frustration, I'd love to know what's wrong with my sed command above.

Upvotes: 9

Views: 2547

Answers (3)

user5849816
user5849816

Reputation:

In terms of doing exactly what your question asks, you can also do the same thing with a range of line numbers. It doesn't use regular expressions, but you might find doing this is easier if looking at the line numbers is convenient for you:

sed -i '<start-of-range>,<end-of-range>d' FileName

Upvotes: 0

thiton
thiton

Reputation: 36059

The best source of information is often the man page. You can reach it with the command man sed.

d takes an address range according to the man page. An address can be a number, a /regexp/, or a number of other things. An address range is either one address or two addresses, separated by comma. You have been trying to use an address range and then an address.

As 1_CR pointed out, you can work around by using a block instead:

sed -i -r "/_start_/,/_end_/ {/^#/ d}" FileName

A block accepts an address range, and every command accepts an address range again, so you can combine the regexps.

Upvotes: 8

iruvar
iruvar

Reputation: 23394

You need to change

sed -i -r "/_start_/,/_end_/ /^#/ d" FileName

to

sed -i -r "/_start_/,/_end_/{/^#/d}" FileName

Upvotes: 2

Related Questions