sed help please
Arthur Chance
freebsd at qeng-ho.org
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 ----
:copy
/foo/bfoo
p
n
bcopy
:foo
s/foo.*//p
:cut
n
/bar/bbar
bcut
:bar
s/.*bar//
bcopy
---- 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