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

쉘에서 첫 번째 Proxy_pass를 url1로 바꾸고 두 번째 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.

관련 정보