0

I am trying to search between patterns. I know sed will do it if it is a single occurrence.

Here is the file:

Iowa<br>
data1<br>
data2<br>
Montana<br>
junk1<br>
junk2<br>
junk3<br>
Iowa<br>
data3<br>
data4<br>
Arizona<br>
junk5<br>
junk6<br>

I am trying to get the content between Iowa and Montana.

So, I do sed -ne '/Iowa/,/Montana/p $file and see a result like this:

Iowa<br>
data1<br>
data2<br>
Montana<br>
Iowa<br>
data3<br>
data4<br>
Arizona<br>
junk5<br>
junk6<br>

Not sure why it prints Iowa - Arizona and beyond. Is there a way to print the content between Iowa and Montana only?

As a temporary workaround, I am printing all and taking the 1st occurrence.

mickmackusa
  • 43,625
  • 12
  • 83
  • 136
  • 1
    the last awk answer (http://stackoverflow.com/a/38972737/4082052) fits... also suggest to add your expected output to know if you need `Iowa` and `Montana` also in output or only lines between them... also make it clear if your input can contain multiple or only one `Iowa...Montana` – Sundeep Apr 20 '17 at 02:18

2 Answers2

0

If you were wanting to use perl, this one-liner does the job:

perl -ne 'last if /Montana/; print if $i; $i++ if /Iowa/' $file

output:

data1
data2
cbmckay
  • 466
  • 7
  • 19
0

Try flip flop operator

perl -ne 'next if (1 ../Iowa/); last if(/Montana/); print;' input.txt
mkHun
  • 5,891
  • 8
  • 38
  • 85