如何使用sed通过正则表达式替换一行并修改原始文件

如何使用sed通过正则表达式替换一行并修改原始文件

我有一个像这样的 nginx 配置文件:

server {
    listen       80;
    server_name  localhost;

    location /api/test {
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        proxy_read_timeout 3000;
        send_timeout 3000;
        client_max_body_size 10M;
        client_body_buffer_size 100M;
        proxy_pass http://demo.com/;
    }

    location /api/demo {
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        proxy_read_timeout 3000;
        send_timeout 3000;
        client_max_body_size 10M;
        client_body_buffer_size 100M;
        proxy_pass http://demo2.com/;
    }
}

我想如何在 shell 中使用 url1 替换第一个 proxy_pass 和 url2 替换第二个 proxy_pass,这是我的 shell 脚本,如下所示:

#!/usr/bin/env bash

set -u

set -e

set -x

echo "please input url1:"

read URL1

echo "$URL1"

echo "plase input url2:"

read URL2

echo "$URL2"


sed -E "12s/.*proxy\_pass.*/proxy\_pass:$URL1/" nginx.conf

sed -E "22s/.*proxy\_pass.*/proxy\_pass:$URL2/" nginx.conf

现在我面临一个问题,sed没有修改原始文件,只在终端输出url,我该怎么做才能让它修改原始配置文件?我想要这样的(输入www.google.com;www.facebook.com;):

server {
    listen       80;
    server_name  localhost;

    location /api/test {
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        proxy_read_timeout 3000;
        send_timeout 3000;
        client_max_body_size 10M;
        client_body_buffer_size 100M;
        proxy_pass www.google.com;
    }

    location /api/demo {
        proxy_connect_timeout 3000;
        proxy_send_timeout 3000;
        proxy_read_timeout 3000;
        send_timeout 3000;
        client_max_body_size 10M;
        client_body_buffer_size 100M;
        proxy_pass www.facebook.com;
    }
}

答案1

sed修改原始文件,您需要-i.另外,请不要强迫您的用户手动输入内容。这只会让你的脚本更难使用:你不能轻松地重新运行,你不能自动化,而且很容易出错。相反,让脚本从命令行读取 URL:

#!/usr/bin/env bash
set -u
set -e
set -x


sed -i -e "12s/.*proxy_pass.*/proxy_pass:$1;/" \
       -e "22s/.*proxy_pass.*/proxy_pass:$2;/" nginx.conf

proxy_pass:不过,您可能应该进行备份,并且您想保持数据的对齐,而文件中没有,您有proxy_pass,它看起来是正确的格式,所以请尝试这样的操作:

#!/usr/bin/env bash
set -u
set -e
set -x

timestamp=$(date +%s.%N)

sed -Ei."$timestamp".bak -e "12s/(.*proxy_pass ).*/\1$1;/" \
        -e "22s/(proxy_pass ).*/\1$2;/" nginx.conf

然后,您可以使用 IP 作为参数来运行此命令:

$ foo.sh 1.2.3.4 5.6.7.8
++ date +%s.%N
+ timestamp=1663148866.892161961
+ sed -Ei.1663148866.892161961.bak -e '12s/(.*proxy_pass ).*/\11.2.3.4/' -e '22s/(proxy_pass ).*/\15.6.7.8;/' nginx.conf

这将创建一个名称nginx.conf.1663148416.987587536.bak与原始nginx.conf文件相同的文件,并在nginx.conf.

相关内容