如何将字符串中的字面量*替换为变量?多种尝试未成功
解决字符串字面量
*替换失败的问题 核心问题:Shell通配符扩展导致*被提前解析
你遇到的问题大概率是变量传递时未加引号,导致Shell把字符串里的*当作通配符,提前展开成当前目录下的文件列表,而不是作为字面量传递给sed或参数扩展。比如当前目录有file1.txt、file2.txt,<<< $exlusion会把*:public_html变成file1.txt file2.txt :public_html,此时sed根本看不到原字符串里的*,自然无法替换。
正确写法示例
1. 使用sed的正确姿势
必须给变量$exlusion加上双引号,同时正则里用\*匹配字面量*:
sed "s/\*/$domain/g" <<< "$exlusion" # 如果要直接修改变量,用命令替换: exclusion=$(sed "s/\*/$domain/g" <<< "$exlusion")
注意:变量赋值不能有空格,你之前写的$exlusion = sed ...是语法错误。
2. 使用Bash参数扩展的正确姿势
参数扩展中匹配字面量*只需转义一次,不需要双重转义:
exclusion="${exlusion//\*/$domain}"
你之前写的\\*会被Shell解析成\*,实际是在匹配字面量\*(带反斜杠的星号),而非单纯的*,所以匹配失败。
为什么SSH测试正常?
因为你测试时当前目录没有文件,Shell无法展开*,所以*会被当作字面量传递给sed,替换生效。但实际场景中目录存在文件时,*就会被展开,导致替换失效。
内容的提问来源于stack exchange,提问作者Andrew Newby
相关产品推荐
相关产品推荐

