我想server {
在nginx.conf
文件的字符串后添加下面的代码片段。
location /nginx-status {
stub_status on;
allow all;
}
下面的脚本在server {
该字符串出现的位置后添加了代码片段。这太多了。
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"
sed -i '/server {/r 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
该nginx.conf
文件包含多个字符串server {
。但我只需要找到第一个出现的位置并在其下方添加新内容。只有第一个出现的位置server {
未注释,nginx.conf
文件中所有其他出现的位置均已注释,应保留不变。
我该怎么做?我该如何限制我的代码,以便添加新内容仅有的第一次出现之后server {
?
答案1
该解决方案应该在 GNU 中起作用sed
。
您可以在中嵌套地址范围sed
。从以下命令开始:
sed -i '/server {/r content.txt' $path/nginx.conf
并将其变成:
sed -i '0,/server {/ {
//r content.txt
};' "$path"/nginx.conf
(我固定引用这里。在您的脚本中,还有其他地方需要修复引用。)
诀窍在于0,/server {/
范围。范围是从第一行到(包括)第一次出现 的行server {
。它类似于1,/server {/
,但如果server {
出现在第一行,0,/server {/
则将第一行视为范围的结尾,而1,/server {/
将其视为范围的开头(因此它将在第二出现server {
,如果存在的话)。 带有 的变体0
对我们来说很好,但我认为它不可移植。 GNUsed
肯定支持它。
(如果您sed
不支持此0
地址,请在最开始添加一个虚拟(空)行,使用范围1,/server {/
,最终删除虚拟行。由于虚拟行的存在,它server {
永远不会出现在第一行,因此1,/server {/
可以正常工作。)
{ … };
只有在此范围内,才会执行其中的 sed 代码。此代码是您的原始 sed 代码(我只是将其替换/server {/
为//
,这意味着“使用最近使用的正则表达式”,因此它实际上仍然/server {/
但它干燥)。
遇到第一次出现的 后/server {/
,r content.txt
将执行 ,并且 指定的范围0,/server {/
结束。该范围将不会匹配其他行,因为没有其他行是第一行。这保证r
最多执行一次。
笔记:
- 的内容
content.txt
将添加在第一个线包含server {
,而不是在(子)字符串 之后server {
。如果该行是 egserver { foo
,那么它将保持这样,新内容将出现在其下方,而不是在{
和之间foo
。您的原始代码以这种方式工作,我假设这就是您想要的,问题仅在于限制在第一次出现。