如何在bash中打印两个匹配行之间的内容,排除含第三个匹配项的区间
解决方案
调整思路:你原来的逐行打印逻辑无法提前判断区间内是否存在Z,因此需要先缓存整个A到C区间的内容,待匹配到结束标记C时,判断区间内无Z再输出缓存内容即可。
调整后的awk代码如下:
'/A/{ p=1 has_z=0 buf="" } p{ buf = buf $0 "\n" if(/Z/) has_z=1 } /C/{ p=0 if(!has_z) printf "%s", buf } ' 目标文件名
代码逻辑说明:
- 匹配到起始标记
A时:开启区间记录状态,重置Z存在标记,清空区间缓存 - 处于区间记录状态时:将每一行追加到缓存中,若当前行匹配
Z则标记区间存在Z - 匹配到结束标记
C时:关闭区间记录状态,若区间不存在Z则输出缓存的全量区间内容
针对你给出的示例文件运行上述代码,将直接输出你预期的结果。
内容的提问来源于stack exchange,提问作者Piotrek Cyran
相关产品推荐
相关产品推荐

