Regex linux bash字符串替换

Regex linux bash字符串替换,regex,linux,string,bash,Regex,Linux,String,Bash,这里的实际需求是在运行时用相当标准的值替换nginx服务器块中的一些标记: server { listen 80;# default_server; root <sitepath />/<sitename />/sitefiles/public; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; index index.php index.html index.htm;

这里的实际需求是在运行时用相当标准的值替换nginx服务器块中的一些标记:

server {
    listen 80;# default_server;

    root <sitepath />/<sitename />/sitefiles/public;

    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;

    index index.php index.html index.htm;

    server_name <sitename />;#<- server_domain_or_$

    error_log <sitepath />/<sitename />/platform_dir/logs/nginxerror.log;
    access_log <sitepath />/<sitename />/platform_dir/logs/nginxaccess.log;


    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 60;
        include fastcgi_params;
    }
}

我要冒险,假设
$wwwroot
包含斜杠。
这将是
sed
命令的一个问题,因为您选择了斜杠作为正则表达式分隔符。使用不同的字符(不太可能是
$wwwroot
的一部分,例如
#
)可以解决以下问题:

echo "$block" | sed -r "s#<sitepath />#$wwwroot#g"
echo“$block”| sed-r“s###$wwwroot#g”

我要冒险,假设
$wwwroot
包含斜杠。
这将是
sed
命令的一个问题,因为您选择了斜杠作为正则表达式分隔符。使用不同的字符(不太可能是
$wwwroot
的一部分,例如
#
)可以解决以下问题:

echo "$block" | sed -r "s#<sitepath />#$wwwroot#g"
echo“$block”| sed-r“s###$wwwroot#g”

谢谢编辑-预览时看起来不错谢谢编辑-预览时看起来不错?它自动检测分离器。没有在任何地方看到记录。非常感谢。@DataMechanics手册页没有列出它,但至少在Ubuntu上,
info sed
为您提供了更完整的手册。导航到
sed Programs>时,“s”命令显示:
s(如替换)命令的语法为“s/REGEXP/REPLACEMENT/FLAGS”。“/”字符可以统一替换为任何给定的“s”命令中的任何其他单个字符。“/”字符(或替代它使用的任何其他字符)只有在前面有“\”字符时才能出现在REGEXP或替换中。
但这不会返回到带有block=“$block”| sed-r“s#+#$wwwroot#g”的变量中@数据力学这个答案有什么问题?我不明白。。。您将答案标记为解决方案,然后回滚您的决定。为什么?它没有检测到分离器;您真正要做的是在shell中动态构建
sed
命令,而不是将变量的值直接传递给shell。这意味着
sed
认为将
的“s/+/$wwwroot/g”或“s/+//foo/bar/g”作为第一个参数没有区别。真的吗?它自动检测分离器。没有在任何地方看到记录。非常感谢。@DataMechanics手册页没有列出它,但至少在Ubuntu上,
info sed
为您提供了更完整的手册。导航到
sed Programs>时,“s”命令显示:
s(如替换)命令的语法为“s/REGEXP/REPLACEMENT/FLAGS”。“/”字符可以统一替换为任何给定的“s”命令中的任何其他单个字符。“/”字符(或替代它使用的任何其他字符)只有在前面有“\”字符时才能出现在REGEXP或替换中。
但这不会返回到带有block=“$block”| sed-r“s#+#$wwwroot#g”的变量中@数据力学这个答案有什么问题?我不明白。。。您将答案标记为解决方案,然后回滚您的决定。为什么?它没有检测到分离器;您真正要做的是在shell中动态构建
sed
命令,而不是将变量的值直接传递给shell。这意味着
sed
认为将
的“s/+/$wwwroot/g”或“s/+//foo/bar/g”作为第一个参数没有区别。
echo "$block" | sed -r "s#<sitepath />#$wwwroot#g"