我有这个有效的命令行表达式:
program --files path_to_mydir/mydata_[0-9].csv
我想离开,[0-100]
但这不起作用。
program --files path_to_mydir/mydata_[0-100].csv
另外,还有一个问题,你怎么称呼[0-10]
wrt shell 脚本和 bash 脚本?
谢谢
编辑:虽然类似,但这个问题并未询问ls
答案1
这[...]
是一个括号表达式。它始终匹配单个字符,因此您不能使用它,[0-100]
因为它只匹配单个0
或1
(在 POSIX 语言环境中)
在zsh
shell 中,您可以使用<0-100>
数字范围通配模式,但这在以下情况下不起作用bash
:
program --files path_to_mydir/mydata_<0-100>.csv
在bash
,你可以使用大括号扩展代替:
program --files path_to_mydir/mydata_{0..100}.csv
但您必须意识到这与文件名通配模式之间的区别。大括号扩展,如上面的扩展,生成字符串,无论什么文件名可用,而文件名通配模式匹配现有名称。这意味着大括号扩展可能会提供不存在的程序文件名。
你可以用于[...]
匹配具有 0 到 100 之间数字的文件,但您必须将其设置为三种模式,每种模式对应一个数字长度:
shopt -s nullglob
program --files \
path_to_mydir/mydata_[0-9].csv \
path_to_mydir/mydata_[1-9][0-9].csv \
path_to_mydir/mydata_[1][0][0].csv
第一个将匹配包含数字0
到 的名称,第二个将匹配包含到 的9
名称,最后一个将匹配包含 的名称。10
99
100
您想要匹配零填充的整数吗:
shopt -s nullglob
program --files \
path_to_mydir/mydata_[0][0-9][0-9].csv \
path_to_mydir/mydata_[1][0][0].csv
我nullglob
在此代码的两个变体中设置了 shell 选项,以确保删除任何与任何名称不匹配的模式,并且不会留下未展开的情况。
用户 fra-san 注意到,您可以将上面的大括号扩展与强制 shell 触发通配模式匹配的内容结合使用:
shopt -s nullglob
program --files path_to_mydir/[m]ydata_{0..100}.csv
[m]
在字符串中包含(与字符 匹配的模式m
)将强制 shell 将大括号扩展创建的每个字符串视为单独的通配模式。由于我们使用的是nullglob
,因此与现有名称不对应的模式将从参数列表中删除。
请注意,这将生成并扩展 101 个通配模式,而本答案中使用通配的其他方法则使用两个或三个模式。
答案2
glob运算[...]
符与类似的正则表达式运算符一样,匹配指定集中的字符(或可能的整理元素)。
它只匹配一个字符。里面[...]
,你可以有
- 单个字符,例如
[abc]
匹配a
orb
或c
- 字符类,例如
[[:digit:]]
匹配isdigit()
返回 true 的字符。 - 范围类似于在和
[a-f]
之间排序的字符(或排序元素)(请注意,它可能并且通常包含的不仅仅是例如落在该范围内的东西)。a
f
abcdef
é
- 更深奥的,比如
[[=e=]]
等效类、[[.x.]]
按名称给出的整理元素......
您可以将所有这些结合起来。例如,[[:blank:][:digit:]a-f123]
who 会匹配空白、数字、a 和 f 之间的字符或者 1、2 或 3。
您[0-100]
匹配的字符在 0 和 1 或 0 或 0 之间排序,因此其中之一01٠۰߀०০੦૦୦௦౦౸೦൦෦๐໐༠༳၀႐០៰᠐᥆᧐᪀᪐᭐᮰᱀᱐⁰₀↉⓪⓿〇㍘꘠꣐꤀꧐꧰꩐꯰0