期间通配符无法在Bash模式替换中工作

时间:2012-06-04 04:48:16

标签: regex bash

鉴于此Bash代码:

TEMP="1_2"
echo ${TEMP/_.*/}

为什么打印出1_2而不是1

我也试过这些,但他们不能工作:

echo ${TEMP/_\.*/}
echo ${TEMP/_\\.*/}

这确实有效:

echo ${TEMP/_[0-9]*/}

但我想知道:

  1. 为什么这段时间不作为通配符?
  2. 我应该使用什么?

1 个答案:

答案 0 :(得分:5)

问号是单字符通配符。但是,它不像星号是量词的正则表达式那样工作。在Bash中,在参数扩展中,星号是多字符通配符。

$ temp=1_2
$ echo "${temp/_*}"
1

以下内容也适用于此特定情况。有关差异的详情,请参阅man bash中的Parameter Expansion

echo "${temp%_*}"
echo "${temp%%_*}"

我建议不要使用all-caps变量名,以减少名称与shell或环境变量冲突的可能性。