![使用sed时如何处理带有特殊url字符的参数](https://linux22.com/image/210663/%E4%BD%BF%E7%94%A8sed%E6%97%B6%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E5%B8%A6%E6%9C%89%E7%89%B9%E6%AE%8Aurl%E5%AD%97%E7%AC%A6%E7%9A%84%E5%8F%82%E6%95%B0.png)
现在我想使用 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
}
}
这是替换 shell 脚本:
#!/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