使用shell脚本在文本文件中的特定字符串后添加新内容

使用shell脚本在文本文件中的特定字符串后添加新内容

我想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 {。如果该行是 eg server { foo,那么它将保持这样,新内容将出现在其下方,而不是在{和之间foo。您的原始代码以这种方式工作,我假设这就是您想要的,问题仅在于限制在第一次出现。

相关内容