Grep Regex 匹配未按预期返回结果

Grep Regex 匹配未按预期返回结果

我有几个 Ubuntu 服务器,其中的一些行为令我好奇。

在任何新安装的机器(Ubuntu Server 12.04.3 LTS)上,如果我运行:

echo "testbla123" | grep -P -o [0-9]*

这将按123预期返回。

在较旧的机器(Ubuntu Server 12.04.1 LTS)上,如果我运行相同的命令,则不会得到任何结果,我必须运行:

echo "testbla123" | grep -P -o "[0-9]*"

执行后apt-get upgrade,它将在正则表达式周围不带引号地执行。

两台机器上的 Grep 版本相同。我尝试比较更新前后的依赖关系一段时间,但没有成功。

我想知道是否有人知道为什么会发生这种情况?

答案1

有可能您[0-9]*的第二台机器上有一个与 glob 模式匹配的文件,而第一台机器上没有。如果是这种情况,shell 会将 glob 扩展为文件的名称,然后将其作为参数传递给grep

如果当前目录中没有匹配的文件,shell 将保持不变,并将其按原样传递给命令。

$ echo abc123 | grep -P -o [0-9]*
123
$ touch 234
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 234
$ touch 123
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 123 234
$ rm 234 123
$ touch 12
$ echo abc123 | grep -P -o [0-9]* # shell runs grep -P -o 12
12
$ 

如果您不希望 shell 扩展包含 shell 通配符的参数,请始终用引号括起来。

相关内容