Jda*_*ian 5 bash ksh pattern-matching prefix suffix
我想我理解了可选的使用 ?(pattern-list)(bash当extglobshell 选项打开时)和默认情况下的使用ksh。例如在bash:
$ shopt -s extglob
$ V=35xAB
$ echo "${V#?(35|88)x}" "${V#35}"
AB xAB
Run Code Online (Sandbox Code Playgroud)
但是,当匹配的前缀模式只有 one?()或 one时*()(这引入了我所说的可选模式),35除非使用,否则不会被省略##:
$ echo "${V#?(35|88)}" "${V#*(35|88)}" # Why 35 is not left out?
35xA 35xA
$ echo "${V##?(35|88)}" "${V##*(35|88)}" # Why is it omitted when ## is used?
xA xA
Run Code Online (Sandbox Code Playgroud)
?()当和*()用于匹配后缀模式时(使用%和) ,会报告相同的行为%%:
$ echo "${V%5?(xA|Bz)}" # 5xA is omitted
3
$ echo "${V%?(xA|Bz)}" "${V%*(xA|Bz)}" # why xA is not left out?
35xA 35xA
$ echo "${V%%?(xA|Bz)}" "${V%%*(xA|Bz)}" # xA is omitted when %% is used
35 35
Run Code Online (Sandbox Code Playgroud)
我在bash版本 3.2.25、4.1.2 和 4.1.6 中测试了这个问题,这让我觉得我可能没有正确理解匹配模式的实际底层 shell 机制。
有人可以阐明这一点吗?
提前致谢
如果你使用@而不是那么?它会按预期工作:
$> echo "${V#@(35|88)}"
xAB
$> echo "${V%@(xAB|Bzh)}"
35
Run Code Online (Sandbox Code Playgroud)
+类似的替代行为*:
$> echo "${V#*(35|88)}"
35xAB
$>echo "${V#+(35|88)}"
xAB
Run Code Online (Sandbox Code Playgroud)
这是因为:
?(pattern-list)# 匹配零次或一次出现的给定模式@(pattern-list)# 匹配给定模式之一和:
*(pattern-list)# 匹配零次或多次出现的给定模式+(pattern-list)# 匹配一次或多次出现的给定模式