我有一个像下面这样的模式
Start
Hi
How
Are
You
End
Hi
Start
Hi
How
do
You
Do
End
我需要第一个Start
和之间的字符串End
。
我不想要 secondStart
和End
.
有没有办法做到这一点?
这似乎对我有用:
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
这可能对您有用(GNU sed):
sed -n '/Start/,${//!p;/End/q}' file
sed 是在单行上进行简单替换的出色工具。对于其他任何事情,请使用 awk:
$ awk '/End/{exit} found{print} /Start/{found=1}' file
Hi
How
Are
You
当当前行包含 Start 时,设置“found”标志。在下一行和随后的每一行中,设置了找到的标志,因此打印该行。当看到包含“End”的行时,退出。一切都非常简单,如果将来有必要,您只需移动 {} 部分即可轻松控制是否打印 Start、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
如果 End 可以按照评论中的建议出现在 Start 之前,则只需调整脚本以仅在“found”块中测试 End :
awk 'found{ if (/End/) exit; print } /Start/{ found=1 }' file
您也可以使用ed
脚本来执行此操作:
<<< '/Start/+1,/End/-1p' | ed -s infile
输出:
Hi
How
Are
You