如何用sed移除nginx.conf中的'$request_body'(含单引号)
解决nginx.conf中移除带单引号的'$request_body'问题
之前命令失效的原因
- 第一个命令
sed s/'\$request_body\'// nginx.conf:shell中单引号内部无法转义单引号,导致shell解析脚本时出错,sed未收到正确的匹配规则。 - 第二个命令
sed s/\'$request_body\'// nginx.conf:$request_body会被shell当作环境变量展开,若该变量未定义则会被替换为空,实际sed执行的是s/''//,自然匹配不到目标内容。
正确的sed命令
以下两种方式均可实现需求,核心是让shell不解析$request_body中的$,同时正确匹配单引号:
方法1:shell单引号转义写法
sed -i 's/'\''$request_body'\''//g' nginx.conf
- 解释:
'\''是shell中在单引号包裹字符串里插入单引号的标准写法(关闭单引号→转义单引号→重新打开单引号),最终sed接收的匹配规则是s/'$request_body'//g,全局移除所有'$request_body'内容。 -i选项:直接修改原文件,若仅需预览修改结果可去掉该选项,输出到终端查看。
方法2:使用八进制转义表示单引号
sed -i 's/\047$request_body\047//g' nginx.conf
- 解释:
\047是单引号的八进制ASCII转义码,在sed的单引号脚本中可直接使用,避免shell的单引号转义问题,效果与方法1一致。
效果验证
假设nginx.conf中有如下行:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$request_body"'
执行命令后会变为:
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"'
内容的提问来源于stack exchange,提问作者Mithun j
相关产品推荐
相关产品推荐

