我想使用通配模式仅匹配可打印(包括空格)的 ASCII 字符0x20
到0x7e
.这是在一个内部使用的super
super.tab
数据库。
我已经得出了这样的模式:
[[ -~]]
这似乎有效,并且确实限制了非打印字符作为参数传递。
我是否忽略了任何内容,或者这是指定该字符范围的正确方法?
编辑:
基于麦克塞夫建议使用[[:print:]]
,我尝试过,但似乎不起作用。
这是我的super.tab
条目的样子:
dosuperthing /system/dosuperthing.pl $Users uid=0 arg1="[[:print:]]"
如果我尝试[[:print:]]
,[:print:]
或:print:
作为其通配模式,则会(分别)在我作为第一个参数传递的位置arg1
记录以下内容:super
abcdef
super: (admin) Your argument #1 <abcdef> must match pattern <[[:print:]]>
super: (admin) Your argument #1 <abcdef> must match pattern <[:print:]>
super: (admin) Your argument #1 <abcdef> must match pattern <:print:>
arg1-99
这是旧的遗留生产代码,除了调整内部可接受的模式之外,我无法对其进行修改super.tab
。
答案1
glob 模式或正则表达式[ -~]
匹配 C 语言环境中的所有可打印字符:这匹配从 32(空格)到 126(波形符)的所有字符。在 C 以外的语言环境中(更准确地说,如果LC_COLLATE
不是 C),如果应用程序是语言环境感知的,则这可能与其他字符匹配。
编写此模式的另一种方法是[[:print:]]
。但是,这会匹配当前区域设置中的所有可打印字符(基于设置LC_CTYPE
),因此它并不比[ -~]
您的用例更好。此外,如果您的应用程序或系统库太陈旧而无法理解语法,它可能无法工作[:class:]
。
Super 的语法(如果设置了全局选项)遵循相同的原则,因此它的意思是“仅可打印 ASCII 字符”。Super 不会设置除 之外的任何语言环境,因此您在这方面是安全的。确保[[cHARS]]
patterns=shell
[[ -~]]
LC_CTYPE
patterns=shell
是放;默认值为patterns=regex
,这需要您^[ -~]*$
改为编写。