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

관련 정보