sed help please

Arthur Chance freebsd at
Fri Mar 4 13:04:39 UTC 2016

On 04/03/2016 04:05, David Banning wrote:
> I am trying to change hundreds of lines of text. Given the following text;
> line 1
> line 2 foo take this text
> line 3
> line 4
> line 5 bar leave this text
> line 6
> line 7
> I need a sed command that would take everything between foo and bar -
> including foo and bar.
> Ideally the output would look like;
> line 1
> line 2
> leave this text
> line 6
> line 7
> Keep in mind that foo and bar appear in different
> locations - sometimes at the beginning of a line, sometimes at the end,
> and sometimes in the middle.  I found someone who posted the following
> solution;
> sed '/foo/,/bar/{s/./x/g}' file
> but I found that this does not execute under FreeBSD.  I have looked
> around for differences between FreeBSD and other unix like SED operations
> but only see the -s "", regarding backup file.
> Any pointers would be helpful.

Always nice to have a chance to play with sed, it's the assembler of 
editing, complete with branches and labels. Put this into file 
foobar.sed (without the delimiters of course)

---- start ----
---- end ----

then invoke with

sed -nf foobar.sed < infile > outfile

The one difference from what you asked for is that it produces

line 1
line 2
  leave this text
line 6
line 7

with the space after the bar remaining. If you want to lose that, change 
s/.*bar// to s/.*bar //. It also won't handle a single line with both 
foo and bar together, that's left as an exercise for the reader (but is 
fairly trivial).

Moore's Law of Mad Science: Every eighteen months, the minimum IQ
necessary to destroy the world drops by one point.

More information about the freebsd-questions mailing list