You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Shell脚本,使其仅在Nginx配置文件的第一个未注释`server {`后添加指定配置段

如何修改Shell脚本,使其仅在Nginx配置文件的第一个未注释server {后添加指定配置段

我来帮你搞定这个问题!你的核心需求很明确:只在Nginx配置里**第一个没被注释的server {**后面插入那段status监控配置,而不是所有匹配的行。咱们先拆解问题,再修改脚本:

原来脚本的问题

你之前用的sed -i '/server {/r content.txt' $path/nginx.conf会匹配所有包含server {的行——不管它是正常的配置行,还是被#注释掉的行,都会在后面插入内容,这就导致了“插入太多”的问题。

解决思路

要实现你的需求,需要做两个关键调整:

  1. 精准匹配未注释的server {:我们要匹配的是行首可以带空格,但绝对没有#注释符号的server {行,对应的正则是^[[:space:]]*server {(^表示行首,[[:space:]]*匹配任意空格/制表符,确保不会误匹配注释行)。
  2. 只处理第一个匹配行:用sed的0,/pattern/语法限定操作范围——从文件开头到第一个匹配pattern的行,这样就能保证只修改一次,后续的匹配行(不管注释与否)都不会被处理。

修改后的完整脚本

把原来的sed命令替换成新的限定版,同时给所有变量引用加上双引号(避免路径含空格时出错),完整脚本如下:

echo "Nginx conf_file_directory"
location=$(which nginx)
export location

echo "Nginx configuration file directory"
path=$($location -V 2>&1 | grep -Po '(?<=--conf-path=).*?(?=/[^/]+(\s|$))')
export path
echo "$path"

dir=$(cd -P -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd -P)
echo "$dir"
export dir

echo "create nginx configuration content file"
cat << 'EOF' > "$dir/content.txt"
location /nginx-status {
    stub_status on;
    allow all;
}
EOF

echo "CONF_FILE file start"
# 关键修改:仅在第一个未注释的server {后插入内容
sed -i '0,/^[[:space:]]*server {/ {
    /^[[:space:]]*server {/r '"$dir/content.txt"'
}' "$path/nginx.conf"

echo "Delete the nginx configuration content file"
file="$dir/content.txt"
if [ -f "$file" ] ; then
    rm "$file"
    echo "deleted"
fi

关键命令解释

新的sed命令sed -i '0,/^[[:space:]]*server {/ { /^[[:space:]]*server {/r '"$dir/content.txt"' }' "$path/nginx.conf"的作用:

  • 0,/^[[:space:]]*server {/:把操作范围锁定在从文件开头到第一个未注释server {行的区间内
  • 大括号里的/^[[:space:]]*server {/r "$dir/content.txt":在这个区间内找到匹配的行后,读取content.txt的内容插入到该行的后面
  • 因为范围限定,这个插入操作只会执行一次,完美符合你的需求

备注:内容来源于stack exchange,提问作者anand8398

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:27:43