在 glob 模式中指定完整范围的可打印 ASCII 字符

在 glob 模式中指定完整范围的可打印 ASCII 字符

我想使用通配模式仅匹配可打印(包括空格)的 ASCII 字符0x200x7e.这是在一个内部使用的super super.tab数据库。

我已经得出了这样的模式:

[[ -~]]

这似乎有效,并且确实限制了非打印字符作为参数传递。

我是否忽略了任何内容,或者这是指定该字符范围的正确方法?

编辑:

基于麦克塞夫建议使用[[:print:]],我尝试过,但似乎不起作用。

这是我的super.tab条目的样子:

dosuperthing  /system/dosuperthing.pl $Users  uid=0 arg1="[[:print:]]"

如果我尝试[[:print:]],[:print:]:print:作为其通配模式,则会(分别)在我作为第一个参数传递的位置arg1记录以下内容:superabcdef

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_CTYPEpatterns=shell 放;默认值为patterns=regex,这需要您^[ -~]*$改为编写。

相关内容