Grep 正则表达式匹配未按预期返回结果

wil*_*hil 2 server package-management command-line regex grep

我有几台 Ubuntu 服务器,有些行为让我很好奇。

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

echo "testbla123" | grep -P -o [0-9]*
Run Code Online (Sandbox Code Playgroud)

这将按123预期返回。

在旧机器(Ubuntu Server 12.04.1 LTS)上,如果我运行相同的命令,我什么也得不到,我必须运行:

echo "testbla123" | grep -P -o "[0-9]*"
Run Code Online (Sandbox Code Playgroud)

执行之后apt-get upgrade,它将在正则表达式周围不加引号的情况下执行。

Grep 在两台机器上的版本相同。我尝试比较更新前后的依赖关系一段时间,但运气不佳。

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

Mat*_*Mat 6

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

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

$ 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
$ 
Run Code Online (Sandbox Code Playgroud)

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

  • 您是否 100% 确定在升级前后在同一目录中运行了这些命令?外壳升级了吗? (3认同)