获取两种模式之间的界限

时间:2017-12-28 08:07:52

标签: shell sed ksh

我使用ksh shell,以下是文件中的示例文本

AAA
ccc
ddd
eee
XXX
AAA
lll
mmm
eee
YYY

从上面的文字中,我想只打印AAAXXX之间的一行,最终输出就像

AAA
ccc
ddd
eee
XXX

1 个答案:

答案 0 :(得分:0)

您可以将sed用于此类任务。它支持类似于匹配AAA的行的语法,打印所有内容,包括匹配XXX的行。

唉,你的输入有点格格不入,因为起始模式AAA出现两次,而第二个XXX没有匹配AAA。 sed默认行为是在第二个AAA之后找不到XXX时从第二个AAA匹配到输入中的最后一行。详细信息在sed faq的最后一节中进行了解释。

但是还有一个解决方法,如何仅匹配第一个块:此代码直接从常见问题解答中获取并用于您的问题:

sed -n '/AAA/{:a; N;/XXX/! b a; p;} yourfile.txt'
  • /AAA//XXX/是sed表达式,以匹配您的开始和结束行
  • /AAA/{:a;N;/XXX/! ba; ... }是一个循环:从匹配AAA的行开始
    • 执行读取下一行的N命令
    • 如果该行与/XXX/!不匹配(请注意否定匹配的!),则会将(b)分支回标签a,读取下一行。< / LI>
    • 只有当该行符合XXX时,我们才会离开分支循环并打印p

如果您的输入始终与每个XXX匹配AAA且这些块未嵌套,则命令更加直观:

sed -n '/AAA/,/XXX/ p' yourfile.txt