如何修改Shell脚本,使其仅在Nginx配置文件的第一个未注释`server {`后添加指定配置段
如何修改Shell脚本,使其仅在Nginx配置文件的第一个未注释
server {后添加指定配置段 我来帮你搞定这个问题!你的核心需求很明确:只在Nginx配置里**第一个没被注释的server {**后面插入那段status监控配置,而不是所有匹配的行。咱们先拆解问题,再修改脚本:
原来脚本的问题
你之前用的sed -i '/server {/r content.txt' $path/nginx.conf会匹配所有包含server {的行——不管它是正常的配置行,还是被#注释掉的行,都会在后面插入内容,这就导致了“插入太多”的问题。
解决思路
要实现你的需求,需要做两个关键调整:
- 精准匹配未注释的
server {:我们要匹配的是行首可以带空格,但绝对没有#注释符号的server {行,对应的正则是^[[:space:]]*server {(^表示行首,[[:space:]]*匹配任意空格/制表符,确保不会误匹配注释行)。 - 只处理第一个匹配行:用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
相关产品推荐
相关产品推荐

