Regex linux bash字符串替换
这里的实际需求是在运行时用相当标准的值替换nginx服务器块中的一些标记: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;
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"