带有 [:upper:] 和 [:lower:] 和目录的奇怪 bash 正则表达式行为

问题描述 投票:0回答:1

在 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
bash tr
1个回答
1
投票

正如您所指出的,正在进行一些通配。 shell 将

[:upper:]
视为一个 glob。它与
[epru:]
是同一个 glob,并尝试匹配单个字符名称
e
p
r
u
。如果当前目录中存在这样的名称,则
[:upper:]
将替换为所有匹配的名称。如果不存在这样的名称(并且 shell 选项是合适的),则不会进行扩展并且字符串保持不变。 (所以,在那种情况下,它不同于 glob
[epru:]
)。

© www.soinside.com 2019 - 2024. All rights reserved.