Bash中提取变量数字失败:为何digits变量为空?
问题原因及解决方法
你遇到的digits变量为空的问题,核心是混淆了Bash参数扩展的glob模式和正则表达式:
Bash里${var//pattern/repl}中的pattern是文件名通配符(glob),不是正则。你用的[^0-9]*在glob里的含义和正则完全不一样:
- glob里的
*是匹配任意数量的任意字符(包括数字); [^0-9]是匹配单个非数字字符;- 合起来
[^0-9]*就是匹配「一个非数字字符 + 后面所有内容」,也就是从第一个非数字字符开始到字符串结尾的全部内容。
你的变量both="abc-123"开头就是非数字的a,所以整个字符串都会被这个模式匹配到,替换成空后digits自然就空了。
至于letters能得到正确结果只是巧合:原字符串里第一个非字母字符是-,[^a-zA-Z]*刚好匹配-123并替换为空,留下了前面的字母。但如果字符串是abc123def,这个写法会错误地把123def全删掉,只留下abc。
正确写法
要提取纯字母或纯数字,应该全局替换每个非目标字符为空,去掉模式里的*:
#!/usr/bin/env bash set -eu both="abc-123" letters=${both//[^a-zA-Z]/} # 替换所有非字母字符为空 digits=${both//[^0-9]/} # 替换所有非数字字符为空 echo "From $both: letters $letters, digits $digits."
运行后输出:
From abc-123: letters abc, digits 123.
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

