获取两种模式之间的界限

问题描述 投票:-6回答:1

我正在使用ksh shell,下面是文件中的示例文本

AAA
ccc
ddd
eee
XXX
AAA
lll
mmm
eee
YYY

从上面的文字,我想只打印AAAXXX之间的线,最终输出将像

AAA
ccc
ddd
eee
XXX
shell sed ksh
1个回答
0
投票

您可以使用sed执行此类任务。它支持一种语法,如匹配AAA的行打印所有内容,包括匹配XXX的行。

唉你的输入有点不正确,因为起始模式AAA发生两次没有匹配的XXX为第二个AAA。 sed默认行为是从第二个AAA匹配到第二个XXX之后找不到AAA时输入的最后一行。细节在sed faq的最后一节中解释。

但是还有一个解决方案,如何只匹配第一个块:这个代码直接取自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读取下一行。 只有当线匹配XXX时,我们才离开分支循环并打印p线

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

sed -n '/AAA/,/XXX/ p' yourfile.txt
© www.soinside.com 2019 - 2024. All rights reserved.