5

Consider the simplified file

AAA
BBB
CCC1
DDD
EEE
CCC2
DDD
FFF
GGG
CCC3
HHH

I can pick out the range EEE to FFF with

sed -n '/EEE/,/FFF/p'

Suppose though that I want to print any line containing C but only within the matching range. I can pipe the result from sed through grep

sed -n '/EEE/,/FFF/p' | grep 'C'

I could also do the range and match in a little awk script (or perl, python, etc.). But how would I do this using just one invocation of sed?

choroba
  • 47,233
Chris Davies
  • 116,213
  • 16
  • 160
  • 287

2 Answers2

14

Use a block in which you tell sed to only print when it sees C:

sed -n '/EEE/,/FFF/{/C/p}'
choroba
  • 47,233
4

You can try :

sed '/EEE/,/FFF/!d;/C/!d'
ctac_
  • 1,960
  • I like this solution too. I haven't got my head around the idea of deleting lines I don't want (although that's perfectly reasonable in a stream editor), and actually not having the -n flag requiring /p has advantages. Thanks – Chris Davies Sep 29 '18 at 17:37