使用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
    }
}

这是替换 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

相关内容