私はシェルスクリプトのいくつかのテキストを置き換えるためにsedを使用しています。これは次のソースファイルです。
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://www.1.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://www.2.com;
}
}
これは私のシェルスクリプトです。
#!/usr/bin/env bash
set -u
set -e
# set -x
echo "please input url1:"
read URL1
echo "plase input url2:"
read URL2
URL1_ESCAPED_REPLACE=$(printf '%s\n' "$URL1" | sed -e 's/[\/&]/\\&/g')
URL2_ESCAPED_REPLACE=$(printf '%s\n' "$URL2" | sed -e 's/[\/&]/\\&/g')
timestamp=$(date +%s)
sed -Ei."$timestamp".bak -e "/\/api\/test/,/proxy\_pass/ s/.*proxy\_pass.*/proxy\_pass $URL1_ESCAPED_REPLACE;/" \
-e "/\/api\/demo/,/proxy\_pass/ s/.*proxy\_pass.*/proxy\_pass $URL2_ESCAPED_REPLACE;/" nginx.conf
このスクリプトはうまくいきますが、交換操作によってスペースインデントが消える問題に直面しました。スペースを削除せずにテキストのみを変更できますか?元のテキスト形式を維持したいです。
ベストアンサー1
.*
削除に問題がなければ、s/.*proxy\_pass
問題は解決します。問題は、次のように一致するすべての文字列を置き換えるsed
コマンドを指定することです。.*proxy_pass.*
.*
0回以上のすべての文字。したがって、この場合、前後のすべての内容がproxy_pass
削除されるため、インデントも削除されます。
この問題を解決するには、sed
コマンドは次のようになります。
sed -Ei."$timestamp".bak -e "/\/api\/test/,/proxy\_pass/ s/proxy\_pass.*/proxy\_pass $URL1_ESCAPED_REPLACE;/" \
-e "/\/api\/demo/,/proxy\_pass/ s/proxy\_pass.*/proxy\_pass $URL2_ESCAPED_REPLACE;/" nginx.conf