Bash字符串替换疑似Bug:替换结果不符合预期
这不是Bash的Bug,是语法误用
你混淆了Bash参数替换中的文件名通配符模式和正则表达式语法:
- Bash的
${FOO/pattern/replacement}语法里,pattern遵循文件名通配规则,而非正则表达式。[:space:]在这里不会被解析为空白字符类,而是被当作单个字符的集合(:,s,p,a,c,e)。 - 你的命令
${FOO/[:space:]*/Hello}实际是匹配第一个出现的:,s,p,a,c,e字符,再替换该字符及后续所有内容为Hello。以FOO="1 dir/hello.txt"为例,第一个匹配的是hello里的e,所以最终得到1 dir/hHello。
正确实现目标的方法
要将第一个空格(含空格)之后的所有内容替换为Hello,有两种常用方式:
1. 用Bash通配符模式的参数替换
直接匹配第一个空格及后续所有内容:
FOO="1 dir/hello.txt" echo "${FOO/ */Hello}" # 输出:1Hello
2. 用正则表达式风格替换(需Bash 3.0+)
借助Bash的正则匹配特性:
FOO="1 dir/hello.txt" [[ $FOO =~ ^([^[:space:]]+)[[:space:]].* ]] && echo "${BASH_REMATCH[1]}Hello" # 输出:1Hello
或者用sed工具:
echo "$FOO" | sed 's/[[:space:]].*/Hello/' # 输出:1Hello
内容的提问来源于stack exchange,提问作者Marcel Plch
相关产品推荐
相关产品推荐

