这是我从Bash V5和V4中获得的粘贴输出,我知道这应该不是,但这是我看到的。显然,它正在删除1个以上的数字。为什么?
匹配一个以上的数字?
,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个字符??
是不真实的,匹配一个字符
?
?
。
vs6
匹配一个字符。在Regex中,
匹配一个或零的一个或零表达式。参见?
?
man 7 glob
.。
LETS拿起字符串:
man 7 regex
和球:
ff6980f4-dff0-11ef-bf71-fcb3bcddc8ae,U=8646:2,S
在字符串中启动
,U=[[:digit:]]?
的位置,以下是匹配的:
零件球表达字符串的部分
,
,
u
,
带有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=
:
echo "new: ${source/,U=*:/:}"
,然后用:
而不是空字符串代替它,以还原原始:
。