"Rudolf Sykora" wrote:
> I have a file say like this
>
> ABC asassadfasdf asdfasdf asdfasdf CBA hhhhhhhhhhjjjjjjjjjjioioioi
> sodifs
> sdfsd
> ABC
> dasdfas aasdfa
> njnjn CBA
>
> and I want to get
>
> ' asassadfasdf asdfasdf asdfasdf '
> 'dasdfas aasdfa'
> 'njnjn'
>
> ...i.e. delimited with ABC from the left and CBA (or
> e.g. EFG) from the right? Say I have a file with such a
> structure and want to only get 'the interesting parts'
> form it.
>
> ...using exclusively sam (and more, possibly without that
> 's' command
>
One of the things I love about ed is how easy it
is to loop through *ranges* which can be delimited
by regexes, like so:
,g/pre-interesting/.+,/post-interesting/-\
s/this/that/g
The same method can be used in sam:
,x/pre-interesting/+#0;/post-interesting/-#0{
x/this/c/that/
}
In cases where the delimeters don't alternate
perfectly (as in nesting), you can just start adding
conditionals and/or subloops:
,x/pre-interesting/.+#0;/post-interesting/-#0{
v/pre-interesting/{
x/this/c/that/
}
}
You can operate on the inverse of the interesting
range by employing a marker in the loop to maintain a
"trailing" range throughout:
0k
,x/pre-interesting/.+#0;/post-interesting/-#0{
v/pre-interesting/{
',.-#0{
x/this/c/that/
}
.+#0k
}
}
etc., etc.
Here's a version that works on your example:
0k
,x/ABC/+#0;/CBA|EFG/{
',.-#0d
.+#0??d
.+#0k
}
-Derek