sedを使用するときに特別なURL文字を含むパラメータを処理する方法

sedを使用するときに特別なURL文字を含むパラメータを処理する方法

私はsedを使ってファイルのURLを変更したいと思います。元のファイルは次のとおりです。

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.baidu.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.google.com
    }
}

代替シェルスクリプトは次のとおりです。

#!/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 -in-place "12s/.*proxy\_pass.*/proxy\_pass:$URL1/" nginx.conf

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

このスクリプトはうまく機能しますが、このような形式でhttp urlを入力すると、http::/www.google.comスクリプトに次のエラーが表示されます。

+ sed -E -in-place '12s?.*proxy\_pass.*/proxy\_pass:http::/www.google.com?' nginx.conf
sed: 1: "12s?.*proxy\_pass.*/pro ...": unterminated substitute in regular expression

sedが特殊文字と連携するようにするにはどうすればよいですか?

ベストアンサー1

s代わりに、コマンドに別の区切り文字を使用できます/

sed -E -in-place "12s|.*proxy_pass.*|proxy_pass:$URL1|" nginx.conf

URLには含めることができないとします|。 URLには&有効なURL文字ですが、sed置換時に特別な意味を持つものを含めることはできません。

また、アンダースコアの前のバックスラッシュは定義されておらず、一部の実装では奇妙な結果が生じる可能性があるため、削除し\_ました。sed

最後に、URLにセミコロンを含める必要がないように、代替エントリのURLの後にセミコロンを追加することを検討できます。

sed -E -in-place "12s|.*proxy_pass.*|proxy_pass:$URL1;|" nginx.conf

おすすめ記事