如何使用sed/awk基于模式匹配提取两个OG匹配行之间的内容
问题说明
现有文本文件包含匹配模式OG的行,文件内容如下:
OG ANNNFKSODJFHFJ SSJSJKSKJSAJAS SSSSSSSSSSSSFA OG FALJFNAFAFNAFJL AFJLJSLJFLFSLFL ASJFAJFAKFKAFKK OG AJSFLJASFLSFLFF SJFLAFLAFLFLAFA ASASFASFOFLJAJF
要求不硬编码指定行号,完全基于模式搜索,打印前两个匹配OG的行之间的内容,预期输出为:
ANNNFKSODJFHFJ SSJSJKSKJSAJAS SSSSSSSSSSSSFA
此前尝试的awk命令无法得到正确结果:
awk '/^OG/{flag=1;next}/^OG/{flag=0}flag' file.txt
正确实现
awk 方案
原命令逻辑缺陷:
- 第一次匹配到
OG就开启打印标记,后续遇到第二个OG关闭标记后,再碰到第三个OG会重新开启标记,会打印多个OG分隔块的内容 - 没有在匹配到第二个
OG后终止程序,会处理完整个文件,存在多余输出
正确命令:
awk '/^OG/{c++; if(c==2) exit; next} c==1' file.txt
执行逻辑:
- 定义计数器
c,每匹配到一行以OG开头的行,计数器加1 - 当计数器等于2(即命中第二个
OG行)时直接退出程序,不处理后续内容 - 匹配到
OG行时跳过当前行(不打印OG本身),计数器等于1时(即处于第一个和第二个OG之间的区间)打印当前行
sed 方案
sed -n '/^OG/{:a;n;/^OG/q;p;ba}' file.txt
执行逻辑:
- 加
-n参数关闭sed默认逐行打印的行为 - 匹配到第一个
OG行后进入循环流程 - 每次读取下一行内容,若读到的是
OG行则直接退出程序,否则打印当前行,继续循环
内容的提问来源于stack exchange,提问作者triangular_triffle
相关产品推荐
相关产品推荐

