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