为什么在此模式中匹配超过1个字符?

问题描述 投票:0回答:2

这是我从Bash V5和V4中获得的粘贴输出,我知道这应该不是,但这是我看到的。显然,它正在删除1个以上的数字。为什么?匹配一个以上的数字?

其余部分是附加的细节,但基本问题在上面。 我正在使用Maildir文件,我正在寻找删除表单
,U=123
的子字符串,

=

之后的值是整数。以下代码有效,但是我尚不清楚参数扩展中的
?

为什么会做正确的事情。

#!/usr/bin/env bash source="$1" echo "src: $source" echo "new: ${source/,U=[[:digit:]]?}"

脚本接受看起来像这样的文件名:

ff6a3828-dff0-11ef-bf71-fcb3bcddc8ae,U=8654:2,
ff69dbee-dff0-11ef-bf71-fcb3bcddc8ae,U=8650:2,F
ff69f368-dff0-11ef-bf71-fcb3bcddc8ae,U=8651:2,
ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae,U=8646:2,S
示例运行:
$ ./maildir-move 'ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae,U=8646:2,S'                                                                                                             
src: ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae,U=8646:2,S
new: ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae46:2,S

man bash

指“模式匹配”部分(来自参数扩展部分),该部分指出:

?      匹配任何单个字符。

所以我正在工作,但我不明白为什么。显然,它比“一个角色”更匹配,但是为什么?
	

为什么在此模式中匹配超过1个字符?

是不真实的,

?

匹配一个字符
?

bash parameter-expansion
2个回答
4
投票
Glob不是正则。在地球仪上
6

匹配一个字符。在Regex中,

?
匹配一个或零的一个或零表达式。参见

?
vs

man 7 glob

.
LETS拿起字符串:

man 7 regex

和球:

ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae,U=8646:2,S

在字符串中启动
,U=[[:digit:]]?
的位置,以下是匹配的:

零件球表达

字符串的部分


u

u[[:DIGIT:]]? 其他代表:,带有ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae,U=8646:2,S ^--------- ? ^---------- [[:digit:]] ^^^----------- ,U= 删除的结果字符串为:,U=86仅与匹配,之后6匹配
= =
8
6
ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae46:2,S ?
8
。如果将某些空间插入

[[:digit:]]

的值以替换匹配的字符,而不是完全删除它们,则可以更清楚地看到这一点。
new
仅5个字符匹配并删除。如果您也要删除

src: ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae,U=8646:2,S new: ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae 46:2,S ^^^^^

,则应按其他答案建议使用延长的地球(相当于权力表达式)。
如果您不需要删除整数,则只有

46
,U=

4
投票

:

将所有内容与所有内容匹配并compluding
echo "new: ${source/,U=*:/:}"
,然后用
:
而不是空字符串代替它,以还原原始
:
	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.