如何仅在每个LOCATION-BLOCK后的首个IF-BLOCK前插入指定注释?
仅在Nginx Location块后的首个If块前插入注释的解决方案
需求是在Nginx配置文件中,仅在每个location块内的第一个if块之前插入注释##INSERT-A NEW-LINE-HERE,但常规的sed匹配所有if块的写法会给每个if都插入注释,无法满足仅处理首个if的要求。
正确的Sed命令
sed -i ' /location/{ :loop N /{/!b loop s/\(.*\)/\1\n flag=1/ } /if ($http_referer/ { /flag=1/ { i\ ##INSERT-A NEW-LINE-HERE s/flag=1// } } ' file.conf
命令逻辑说明
- 标记location块状态:当匹配到
location开头的行时,进入循环读取后续内容,直到找到location块的开括号{,然后在该行末尾添加一个临时标记flag=1,表示当前处于需要处理首个if块的状态。 - 处理首个if块:当匹配到目标
if ($http_referer行时,检查当前行上下文是否存在flag=1标记:- 若存在,就在该行前插入指定注释,同时移除
flag=1标记,确保该location块内后续的if块不会再被处理。 - 若不存在,直接跳过该
if块。
- 若存在,就在该行前插入指定注释,同时移除
执行该命令后,每个location块内只有第一个if块前会插入注释,后续的if块不会受影响,完全符合需求。
内容的提问来源于stack exchange,提问作者n1Ls
相关产品推荐
相关产品推荐

