Linux中字符串替换首选Bash参数扩展:${var//old/new}全局替换,${var/old/new}首处替换,${var/#old/new}开头替换,${var/%old/new}结尾替换;复杂需求用sed。

在 Linux 系统中,对字符串变量中指定字符进行替换,最常用、最直接的方式是使用 Bash 的参数扩展(Parameter Expansion),无需调用外部命令,安全高效。
用 ${var//old/new} 进行全局替换
这是 Bash 内置功能,支持变量内字符串的查找与替换,语法简洁且执行快:
- ${var/old/new}:只替换第一个匹配项(单斜杠)
- ${var//old/new}:替换所有匹配项(双斜杠)
- ${var/#old/new}:仅开头匹配时替换(# 表示行首锚定)
- ${var/%old/new}:仅结尾匹配时替换(% 表示行尾锚定)
例如:
str="a-b-c-d"; echo ${str//-/}输出:abcd
再如替换空格为下划线:
name="hello world test"; echo ${name// /_}输出:hello_world_test
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
处理特殊字符需转义或引用
若要替换的字符是 /、$、\、空格 等,建议用单引号包裹替换内容,避免被 shell 误解析:
- 替换反斜杠:
path="/home/user/docs"; echo ${path//\//_}或更稳妥写法${path//\//_} - 替换美元符:
text='price $10 and $20'; echo ${text//\$/USD}→ price USD10 and USD20
注意:在双引号或无引号环境下,$、\ 等需加反斜杠转义;单引号中除单引号本身外,其余字符均按字面意义处理。
需要正则或复杂逻辑?用 sed 配合 echo
当替换规则涉及正则表达式(如“数字+字母”组合、忽略大小写、多空格合并等),Bash 原生扩展不够用,可借助 sed:
- 全局替换并忽略大小写:
echo "$str" | sed 's/a/b/gi' - 把连续多个空格换成单个下划线:
echo "$str" | sed 's/ \+/_/g' - 删除所有非字母数字字符(保留下划线):
echo "$str" | sed 's/[^a-zA-Z0-9_]/_/g'
注意:sed 是外部命令,会产生子进程,性能略低于参数扩展;但灵活性高,适合脚本中处理不确定格式的字符串。
小技巧:替换结果赋值给新变量或原地更新
可以将替换结果保存到新变量,也可直接更新原变量:
- 生成新变量:
new_str=${str//:/_} - 原地修改:
str=${str//:/_} - 链式替换(分步):
str=${str//a/x}; str=${str//b/y}
不推荐用 eval 或拼接命令字符串,既不安全也不必要。

















