【发布时间】:2018-06-08 18:56:31
【问题描述】:
我正在使用ksh shell,下面是文件中的示例文本
AAA
ccc
ddd
eee
XXX
AAA
lll
mmm
eee
YYY
从上面的文本中,我只想打印AAA 和XXX 之间的行,最终输出将是这样的
AAA
ccc
ddd
eee
XXX
【问题讨论】:
我正在使用ksh shell,下面是文件中的示例文本
AAA
ccc
ddd
eee
XXX
AAA
lll
mmm
eee
YYY
从上面的文本中,我只想打印AAA 和XXX 之间的行,最终输出将是这样的
AAA
ccc
ddd
eee
XXX
【问题讨论】:
你可以使用sed 来完成这样的任务。它支持从匹配AAA 的行打印所有内容的语法,包括匹配XXX 的行。
唉,您的输入格式有点不正确,因为起始模式 AAA 出现了两次,而第二个 AAA 没有匹配的 XXX。当在第二个AAA 之后找不到XXX 时,sed 默认行为是从第二个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 读取下一行。XXX时,我们才离开分支循环并打印p行如果您的输入对于每个 AAA 始终有一个匹配的 XXX 并且这些块没有嵌套,那么该命令会更加直观:
sed -n '/AAA/,/XXX/ p' yourfile.txt
【讨论】: