Shell中如何实现字符串内匹配变量内容替换为另一变量值
问题根因
原脚本替换失效是几个基础语法错误叠加导致的:
- 循环遍历对象错误:
for str in string1 string2 string3遍历的是string1/string2/string3这几个字面字符串,不是对应变量存储的实际文本内容,后续处理的根本不是目标字符串 - 单引号变量不解析:shell中单引号包裹的内容会原样输出,
sed 's/$x/$y/'里的$x、$y会被当成普通字符匹配,不会替换成变量存储的分隔符和目标替换值 - sed传参格式错误:sed 接收待处理文本要么通过管道传入,要么传入文件路径,直接把字符串拼在sed命令末尾会被识别为文件名,根本不会处理目标字符串内容
可直接运行的正确实现
优先用bash内置字符串替换,不需要额外调用sed,执行效率更高:
#!/bin/bash string1="One,two" string2="three.four" string3="five:six" y=";" # 待处理字符串存入数组,遍历逻辑更清晰 str_arr=("$string1" "$string2" "$string3") for str in "${str_arr[@]}"; do # 提取字母间的分隔符:移除所有英文字符,剩余内容就是分隔符 x=$(echo "$str" | sed 's/[a-zA-Z]//g') # 内置替换:把所有匹配到的分隔符换成分号后输出 echo "${str//"$x"/"$y"}" done
如果必须用sed实现替换,注意用双引号包裹sed表达式让shell能解析内部变量,同时通过管道传入待处理文本:
#!/bin/bash string1="One,two" string2="three.four" string3="five:six" y=";" str_arr=("$string1" "$string2" "$string3") for str in "${str_arr[@]}"; do x=$(echo "$str" | sed 's/[a-zA-Z]//g') echo "$str" | sed "s/$x/$y/" done
运行以上任意一段代码,都会输出预期结果:
One;two three;four five;six
内容的提问来源于stack exchange,提问作者mck
相关产品推荐
相关产品推荐

