如何在脚本HD头中捕获Edymode行并在首个END OF HD处停止匹配?
解决方案:提取HD头部块内的Edymode行
方案1:用sed精准定位范围并筛选
sed能直接限定从HD起始到第一个END OF HD结束的块,再从中提取目标行:
sed -n '/^HD$/,/^END OF HD$/{/Edymode:/p}' example.txt
-n:仅输出匹配的行/^HD$/,/^END OF HD$/:锁定范围——从精确匹配HD的行开始,到第一个精确匹配END OF HD的行终止{/Edymode:/p}:在这个范围内,只打印包含Edymode:的行
如果HD或END OF HD前后可能有空白字符(空格、制表符),调整正则适配:
sed -n '/^[[:blank:]]*HD[[:blank:]]*$/,/^[[:blank:]]*END OF HD[[:blank:]]*$/{/[[:blank:]]*Edymode:/p}' example.txt
方案2:用awk灵活控制匹配逻辑
awk通过标记位控制范围,遇到第一个END OF HD直接退出,效率更高:
awk '/^END OF HD$/ {exit} /^HD$/ {flag=1} flag && /Edymode:/' example.txt
/^HD$/ {flag=1}:碰到HD行时,开启匹配标记flag && /Edymode:/:标记开启状态下,打印包含Edymode:的行/^END OF HD$/ {exit}:遇到第一个END OF HD行时立刻停止处理
适配空白字符的版本:
awk '/^[[:blank:]]*END OF HD[[:blank:]]*$/ {exit} /^[[:blank:]]*HD[[:blank:]]*$/ {flag=1} flag && /[[:blank:]]*Edymode:/' example.txt
原grep命令的问题
原命令grep '^[[:blank:]]*##[[:blank:]]*Edymode:' example.txt是全局查找所有符合格式的Edymode行,没有限定在HD到第一个END OF HD的头部块内,会把文件其他位置的匹配行也提取出来,不符合需求。
内容的提问来源于stack exchange,提问作者Dilna
相关产品推荐
相关产品推荐

