If PATTERN2
can occure multiple times, this extracts only inner text:
sed '/PATTERN1/h;//!H;/PATTERN2/!d;//{x;/PATTERN1/!d}'
If PATTERN2
can occur only once, you can use such sed script:
sed -n '/PATTERN1/h;//!H;/PATTERN2/{x;p}' input_file.txt
or:
sed '/PATTERN1/h;//!H;/PATTERN2/!d;//x'
You can reverse the lines, then use sed
with 2 addresses and reverse lines again:
tac input_file.txt | sed -n '/PATTERN2/,/PATTERN1/p' | tac
With sed -z
we could remove everything in front and after the patterns, since regex is greedy:
sed -z 's/.*\(PATTERN1\n\)/\1/;s/\(PATTERN2\n\).*/\1/g'