1

我有一个像下面这样的模式

Start
Hi
How
Are
You
End
Hi
Start
Hi
How
do
You
Do
End

我需要第一个Start和之间的字符串End

我不想要 secondStartEnd.

有没有办法做到这一点?

4

4 回答 4

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
于 2012-10-17T15:07:53.877 回答
2

这可能对您有用(GNU sed):

sed -n '/Start/,${//!p;/End/q}' file
于 2012-10-18T00:02:19.433 回答
2

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
于 2012-10-17T20:16:58.577 回答
1

您也可以使用ed脚本来执行此操作:

<<< '/Start/+1,/End/-1p' | ed -s infile

输出:

Hi
How
Are
You
于 2012-10-17T15:21:47.673 回答