Bash: Retrieve a range with regex (maybe sed?)

I have a file similar to this:

<many lines of stuff>
SUMMARY:
<some lines of stuff>
END OF SUMMARY

I want to extract only material between SUMMARYand END OF SUMMARY. I suspect I can do this with sed, but I'm not sure how to do it. I know that I can change the material between these words:

sed "/SUMMARY/,/END OF SUMMARY/ s/replace/with/" fileName

(But not sure how easy it is to extract this material).

I am Bash on Solaris.

+5
source share
7 answers
sed -n "/SUMMARY/,/END OF SUMMARY/p" fileName
+8
source

If Perlok, you can use:

perl -e 'print $1 if(`cat FILE_NAME`=~/SUMMARY:\n(.*?)END OF SUMMARY/s);'
+1
source

:

sed '1,/SUMMARY/d;/END OF SUMMARY/,$d' filename
+1

(FreeBSD) sed:

sed -E -n -e '/^SUMMARY:/,/^END OF SUMMARY/{ /^SUMMARY:/d; /^END OF SUMMARY/d; p;}' file.txt 
+1

awk:

$ echo 'many
lines
of
stuff
SUMMARY:
this is the summary
over two lines
END OF SUMMARY' | awk '
    BEGIN              {e=0}
    /^END OF SUMMARY$/ {e=0}
                       {if (e==1) {print}}
    /^SUMMARY:$/       {e=1}'

:

this is the summary
over two lines

awk BEGIN, .

(e), , .

0

Solaris nawk

#!/bin/bash
nawk '
/SUMMARY/{
 gsub(".*SUMMARY:","");
 f=1
}
/END OF SUMMARY/{f=0;
 gsub("END OF SUMMARY.*","")
}f' file

$ cat file
1 2 3 <many lines of stuff>
4 5 6 SUMMARY: 7 8 9
<some lines of stuff>
END OF SUMMARY blah
blah

$ ./shell.sh
 7 8 9
<some lines of stuff>
0

sed ( ):

sed -E -n -e '/^SUMMARY:$/{n;h;};/^END OF SUMMARY$/!H;/^END OF SUMMARY$/{g;p;q;}' fileName | sed 1d 

sed script :

http://ilfilosofo.com/blog/2008/04/26/sed-multi-line-search-and-replace/

0

All Articles