linux shell中变量字符替换用参数扩展:${var/old/new}替换首个匹配,${var//old/new}全局替换,${var/#pat/rep}开头匹配替换,${var/%pat/rep}结尾匹配替换。

在 Linux Shell 中替换变量中的指定字符,主要依靠参数扩展(Parameter Expansion)语法,无需调用外部命令如 sed 或 tr,简洁高效。
替换变量中第一个匹配的字符
使用 ${var/old/new} 语法,只替换第一次出现的 old 子串(支持字符串或简单模式,不支持正则)。
例如:
echo ${var/-/_} # 输出:hello_world-hello
替换变量中所有匹配的字符
使用双斜杠:${var//old/new},全局替换所有出现位置。
例如:
var="a-b-c-d"echo ${var//-/_} # 输出:a_b_c_d
替换开头或结尾的字符(前缀/后缀匹配)
用 # 去掉开头匹配(非替换),但结合赋值可间接实现“开头替换”;更直接的方式是组合使用:
-
${var/#pattern/replacement}:仅当pattern匹配开头时才替换第一个匹配 -
${var/%pattern/replacement}:仅当pattern匹配结尾时才替换最后一个匹配
例如:
var="file.txt"echo ${var/#file/backup} # 输出:backup.txt
echo ${var/%.txt/.log} # 输出:file.log
注意大小写与特殊字符处理
原样替换时,old 是字面量匹配(区分大小写),若含 /、$、` 等需转义或用单引号包裹变量名避免意外展开;建议对复杂场景先用 printf '%q' 检查变量内容。
例如安全替换含斜杠的路径分隔符(虽然通常不用替换 /,但原理一致):
echo ${path//\//_} # 输出:_home_user_docs(每个 / 替为 _)











