如何使用AWK仅当前一行匹配PATTERN1时删除匹配PATTERN2的行
AWK实现条件删除行方案
需求描述
仅当某行的前一行匹配模式PATTERN 1时,才删除当前匹配PATTERN 2的行,其余场景下匹配PATTERN 2的行正常保留。
实现命令
awk '!/PATTERN 2/ || !prev; {prev = /PATTERN 1/}' 输入文件
命令说明
- 用变量
prev记录上一行是否匹配PATTERN 1,初始默认值为假 - 输出规则:满足以下任意一个条件就输出当前行:
- 当前行不匹配
PATTERN 2 - 当前行匹配
PATTERN 2,但上一行不匹配PATTERN 1
- 当前行不匹配
- 只有当前行匹配
PATTERN 2且上一行匹配PATTERN 1时,才会跳过输出(即删除该行)
效果验证
针对你给出的示例文本,执行上述命令后输出结果如下:
PATTERN 1 NNN PATTERN 2 PATTERN 1 blabla PATTERN 1 blabla PATTERN 2 PATTERN 1
完全符合删除要求,所有前一行是PATTERN 1的PATTERN 2行都被删除,其余PATTERN 2行正常保留。如果需要适配自定义模式,直接替换命令中的PATTERN 1和PATTERN 2为你需要的正则表达式即可。
内容的提问来源于stack exchange,提问作者Kspael
相关产品推荐
相关产品推荐

