我正在使用 sed 替换 shell 脚本中的一些文本,这是原始文件,如下所示:
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;
}
}
这是我的 shell 脚本:
#!/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.*
和匹配.*
的所有字符串任何字符零次或多次。因此在这种情况下,之前和之后的所有内容都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
答案2
使用开头.*
将选择匹配文本之前的所有内容,包括空格。如果将其替换为固定文本proxy_pass
,则所有前导空格都将被删除。您只需更改替换命令即可保留空格(使用\1
)。
所以你的代码将变成:
timestamp=$EPOCHSECONDS
sed -Ei."$timestamp".bak -e "/\/api\/test/,/proxy_pass/ s/(.*proxy_pass).*/\1 $URL1_ESCAPED_REPLACE;/" \
-e "/\/api\/demo/,/proxy_pass/ s/(.*proxy_pass).*/\1 $URL2_ESCAPED_REPLACE;/" infile