在参数替换中使用模式时必须小心。这些模式不是正则表达式,而是路径名扩展模式或 glob 模式。
想法是删除最后一个数字,因此您要使用删除匹配的后缀模式( ${parameter%%word}
)。在这里,我们删除了由 描述的匹配模式的最长实例word
。使用模式很容易表示单个数字[0-9]
,但是,多位数字更难。为此,您需要使用扩展的 glob 表达式:
*(pattern-list)
:匹配给定模式的零次或多次出现
因此,如果要删除最后一个数字,请使用:
$ shopt -s extglob
$ disk="/dev/sda1"
$ echo "${disk#${disk%%*([0-9])}} "${disk%%*([0-9])}"
1 dev/sda
$ disk="/dev/dsk/c0t2d0s0"
$ echo "${disk#${disk%%*([0-9])}} "${disk%%*([0-9])}"
0 /dev/dsk/c0t2d0s
我们必须使用${disk#${disk%%*([0-9])}}
删除前缀。它本质上是搜索最后一个数字,删除它,使用剩余部分并再次删除该部分。
您还可以使用带有锚点的模式替换( ${parameter/pattern/string}
) 并将%
模式锚#
定到参数的开头或结尾。(man bash
有关更多信息,请参阅)。这完全等同于之前的解决方案:
$ shopt -s extglob
$ disk="/dev/sda1"
$ echo "${disk/${disk/%*([0-9])}/}" "${disk/%*([0-9])}"
1 dev/sda
$ disk="/dev/dsk/c0t2d0s0"
$ echo "${disk/${disk/%*([0-9])}/}" "${disk/%*([0-9])}"
0 /dev/dsk/c0t2d0s