我有一个类似下面的模式
Start
Hi
How
Are
You
End
Hi
Start
Hi
How
do
You
Do
End
我需要第一个Start
和End
之间的字符串。
我不希望第二个Start
和End
之间的字符串。
有办法做到这一点吗?
答案 0 :(得分:5)
这似乎对我有用:
sed -n '/Start/{:a;n;/End/q;p;ba}'
$ echo 'Start
Hi
How
Are
You
End
Hi
Start
Hi
How
do
You
Do
End' | sed -n '/Start/{:a;n;/End/q;p;ba}'
Hi
How
Are
You
答案 1 :(得分:2)
sed是单行简单替换的绝佳工具。其他任何使用awk:
$ awk '/End/{exit} found{print} /Start/{found=1}' file
Hi
How
Are
You
当前行包含Start时,设置“found”标志。在下一行和每个后续行上设置找到的标志,以便打印该行。当看到包含“End”的行时,退出。一切都非常简单,如果有必要,您可以通过移动{}部分轻松控制是打印开始,结束还是两者:
$ awk '/End/{exit} /Start/{found=1} found{print}' file
Start
Hi
How
Are
You
$ awk 'found{print} /End/{exit} /Start/{found=1}' file
Hi
How
Are
You
End
$ awk '/Start/{found=1} found{print} /End/{exit}' file
Start
Hi
How
Are
You
End
或者只是将找到的标志设置为零而不是退出,如果你想要开始/结束之间的所有段:
$ awk '/End/{found=0} found; /Start/{found=1}' file
Hi
How
Are
You
Hi
How
do
You
Do
如果在评论中建议的“开始”之前可以发生“结束”,则只需调整脚本以仅在“已找到”块中测试“结束”:
awk 'found{ if (/End/) exit; print } /Start/{ found=1 }' file
答案 2 :(得分:2)
这可能适合你(GNU sed):
sed -n '/Start/,${//!p;/End/q}' file
答案 3 :(得分:1)
您也可以使用ed
脚本执行此操作:
<<< '/Start/+1,/End/-1p' | ed -s infile
输出:
Hi
How
Are
You