regex Bash扩展的glob模式否定在参数替换中不起作用

kcwpcxri  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(100)

Bash 3.2.57(在macOS 12.6.8上)扩展的glob模式否定在参数替换中不起作用:

$ shopt -s extglob
$ s=abc
$ echo ${s##!(a)*}

我希望最后一个命令输出abc,但它没有输出任何东西。
如果$s的第一个字符不是'a',我如何使第三行不输出任何内容,但如果第一个字符是'a',则输出$s

pqwbnv8z

pqwbnv8z1#

看到

$ shopt -s extglob
$ [[ abc == a!(b)c ]] && echo yes || echo no
no
$ [[ ac == a!(b)c ]] && echo yes || echo no
yes

man bash

  • !(pattern-list)

匹配任何东西,除了给定模式之一
所以这里的anything可以是空字符串。(我认为Bash的手册可以更明确地说明这一点。

tzdcorbm

tzdcorbm2#

如果$s的第一个字符不是'a',我如何使第三行不输出任何内容,但如果第一个字符是'a',则输出$s?

case $s in a*) echo $s;; esac  # conditional execution

[[ $s =~ ^a ]] && echo $s      # conditional execution

[[ ${s:0:1} == a ]] && echo $s # conditional execution

或者更像是你尝试过的

echo ${s/#[^a]*/}              # string parsed to scrub nonmatch

不需要扩展的globbing。

相关问题