在 tr 和 grep 中使用 [:upper:] 和 [:lower:] 等正则表达式可以返回结果 我无法解释当前工作目录是否包含由单字符名称 'l' 和 'p' 组成的目录.
使用bash,从一个空目录开始,使用tr进行大小写转换:
mkdir test
cd test
echo upper | tr [:upper:] [:lower:]
upper
echo UPPER | tr [:upper:] [:lower:]
upper
一切顺利,符合预期。现在再次使用几个空文件夹,首先是“l”,然后是“p”:
mkdir l
echo upper | tr [:upper:] [:lower:]
upper
mkdir p
echo upper| tr [:upper:] [:lower:]
uller
echo UPPER | tr [:upper:] [:lower:]
UPPER
这里显然发生了一些文件通配,这只发生在某些有限的情况下,使用单字符文件夹名称。谁能解释这种行为?
解决方案很简单,将正则表达式用引号括起来,但我真的很想知道这种行为的解释。
echo upper | tr '[:upper:]' '[:lower:]'
upper
正如您所指出的,正在进行一些通配。 shell 将
[:upper:]
视为一个 glob。它与 [epru:]
是同一个 glob,并尝试匹配单个字符名称 e
、p
、r
或 u
。如果当前目录中存在这样的名称,则 [:upper:]
将替换为所有匹配的名称。如果不存在这样的名称(并且 shell 选项是合适的),则不会进行扩展并且字符串保持不变。 (所以,在那种情况下,它不同于 glob [epru:]
)。