我正在使用ksh
shell,下面是文件中的示例文本
AAA
ccc
ddd
eee
XXX
AAA
lll
mmm
eee
YYY
从上面的文字,我想只打印AAA
和XXX
之间的线,最终输出将像
AAA
ccc
ddd
eee
XXX
您可以使用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