sedを使用して正規表現に1行を置き換えて元のファイルを変更する方法

sedを使用して正規表現に1行を置き換えて元のファイルを変更する方法

次の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/;
    }
}

シェルで最初のProxy_passをurl1に変更し、2番目のProxy_passをurl2に置き換えるにはどうすればよいですか?これは次のシェルスクリプトです。

#!/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

関連情報