使用GNU grep 3.7基于多正则条件提取指定IT1-REF组
解决GNU grep提取特定IT1-REF组的问题
问题描述
现有文件内容如下:
IT1*1*EA*VN*ABC@SAC*X*500@REF*ZZ*OK@IT1*1*CS*VN*ABC@SAC*X*500@REF*ZZ*BAR@IT1*1*EA*VN*ABC@SAC*X*500@REF*ZZ*BAR@IT1*1*EA*VN*ABC@SAC*X*500@REF*ZZ*OK@
需要提取满足以下条件的完整组(以IT1开头、REF结尾,@视为段分隔符):
- IT1段包含
*EA* - REF段包含
BAR
目标提取内容:
IT1*1*EA*VN*ABC@SAC*X*500@REF*ZZ*BAR@
之前尝试的命令存在问题:
grep -oP "IT1[^@]*EA[^@]*@.*REF[^@]*BAR[^@]*@" file.txt:因.*贪婪匹配,会捕获跨多个组的多余内容grep -oP "(?<=IT1[^@]*EA[^@]*@).*?(?=REF[^@]*BAR[^@]*@)" file.txt:GNU grep 3.7不支持可变长度后向断言,报错lookbehind assertion is not fixed length
正确提取命令
使用以下GNU grep命令可精准提取目标内容:
grep -oP 'IT1[^@]*EA[^@]*@(?:(?!IT1)[^@]*@)*REF[^@]*BAR[^@]*@' file.txt
命令解释
IT1[^@]*EA[^@]*@:匹配包含*EA*的完整IT1段及结尾的@分隔符(?:(?!IT1)[^@]*@)*:非捕获组,匹配当前IT1组内的中间段(如SAC段),通过(?!IT1)确保不会匹配到下一个IT1组的开头,避免跨组匹配REF[^@]*BAR[^@]*@:匹配包含BAR的完整REF段及结尾的@分隔符
内容的提问来源于stack exchange,提问作者root
相关产品推荐
相关产品推荐

