需要Sed命令在两个模式之间打印而不重复

时间:2012-10-17 14:46:24

标签: unix sed

我有一个类似下面的模式

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

我需要第一个StartEnd之间的字符串。

我不希望第二个StartEnd之间的字符串。

有办法做到这一点吗?

4 个答案:

答案 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