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

Ada*_*ume 2 regex bash

鉴于此Bash代码:

TEMP="1_2"
echo ${TEMP/_.*/}
Run Code Online (Sandbox Code Playgroud)

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

我也试过这些,但它们不起作用:

echo ${TEMP/_\.*/}
echo ${TEMP/_\\.*/}
Run Code Online (Sandbox Code Playgroud)

这确实有效:

echo ${TEMP/_[0-9]*/}
Run Code Online (Sandbox Code Playgroud)

但我想知道:

  1. 为什么这个时期不是通配符呢?
  2. 我应该用什么呢?

Pau*_*ce. 5

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

$ temp=1_2
$ echo "${temp/_*}"
1
Run Code Online (Sandbox Code Playgroud)

以下也适用于这种特殊情况.参见参数扩展man bash的有关差异的详细信息.

echo "${temp%_*}"
echo "${temp%%_*}"
Run Code Online (Sandbox Code Playgroud)

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