2012-06-04 66 views
2

不工作鉴于这种猛砸代码:期通配符猛砸模式替换

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

为什么它打印出来1_2,而不是1

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

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

这并不工作:

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

,但我想知道:

  1. 为什么ISN作为通配符的时期?
  2. 我应该用什么来代替?

回答

5

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

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

以下也适用于这种特殊情况。有关差异的更多信息,请参阅man bash中的Parameter Expansion

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

为了减少名称与shell或环境变量冲突的可能性,我建议不要使用全大写变量名称。

+0

我看到,它使用文件通配符,而不是正则表达式。混乱。 –

+0

@AdamCrume:好吧,它* globbing *,但我不会称之为“文件通配”。 –

+0

请注意,Bash还可以使用=〜匹配运算符在[[...]]内部支持正则表达式。 – cdarke