Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
686 views
in Technique[技术] by (71.8m points)

regex - how can I get sed to quit after the first matching address range?

I have a file:

header
trigger
text1
text2
trigger
text5
trigger
...
trigger
...

I want sed to only match between the first two occurrences of 'trigger'. So I tried:

sed -n '/trigger/,/trigger/p'

But as the man page for sed says, that matches all occurrences within two lines with 'trigger'. I want sed to quit after the first match, so the output would be:

trigger
text1
text2
trigger

How do I accomplish this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can do this with a loop in GNU sed:

sed -n '/trigger/{p; :loop n; p; /trigger/q; b loop}'

Explanation:

  1. When you see the first /trigger/, start a block of commands
  2. p -- print the line
  3. :loop -- set a label named loop
  4. n -- get the next line
  5. p -- print the line
  6. /trigger/q -- if the line matches /trigger/ then exit sed
  7. b -- jump to loop

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...