How to select first occurrence between two patterns including them
sed '/P1/,/P2/!d;/P2/q'
...would do the job portably by d
eleting all lines which do !
not fall within the range, then q
uitting the first time it encounters the end of the range. It does not fail for P2 preceding P1, and it does not require GNU specific syntax to write simply.
with awk
awk '/P1/{a=1};a;/P2/{exit}' file
something P1 something
content1
content2
something P2 something
In sed
:
sed -n '/P1/,/P2/p; /P2/q'
-n
suppresses the default printing, and you print lines between the matching address ranges using thep
command.- Normally this would match both the sections, so you quit (
q
) when the firstP2
matches.
This will fail if a P2
comes before P1
. To handle that case, try:
sed -n '/P1/,/P2/{p; /P2/q}'