如何使用awk排除符合指定字符串条件的文本块
文本块筛选需求说明
我们需要从结构化的条目列表中,筛选出包含ABC标签且不包含DEF标签的独立条目块。
待处理文件格式示例
- name: Sedan tags: - DIGIT - ABC - DEF - YES - name: Combi tags: - DIGIT - ABC - DEF - NO - nane: SUV tags: - DIGIT - DEF - YES - nane: OTHER tags: - DIGIT - ABC - YES
筛选规则
筛选条件为 ABC && !DEF,仅保留同时满足以下两个要求的条目块:
- 块内包含标签
ABC - 块内不包含标签
DEF
预期输出结果
- nane: OTHER tags: - DIGIT - ABC - YES
初始尝试代码及问题
首次编写的awk命令存在逻辑缺陷,会错误输出同时包含两个匹配模式的所有文本块,不符合筛选要求:
awk '/^- name:/ { if (found && value) {print value} found=value="" } { value=(value?value ORS:"")$0 } /ABC/ && !/DEF/ { found=1 } END { if (found && value) { print value } }' file
可行的多文件批量处理方案
以下脚本可对/home目录下的所有非空文件批量执行筛选操作:
for i in `find /home/ -mindepth 1 -type f ! -empty`; do ln=`awk -v RS='(^|\n)- ' '/- ABC(\n|$)/ && !/- DEF(\n|$)/ {printf "- %s\n", $0}' $i; printf $i`; echo -e $ln"\n" | sed -n -e 's/^.*file: //p' | grep txt ; done
内容的提问来源于stack exchange,提问作者FotisK
相关产品推荐
相关产品推荐

