apt-file 正则表达式:转义点

gog*_*lla 4 apt bash regex perl apt-file

我想找到所有提供文件名中包含“ssl”的共享对象的包。在易文件手册页说:

--regexp | -x 将模式视为 (perl) 正则表达式。有关详细信息,请参阅 perlreref(1)。如果没有此选项,模式将被视为要搜索的文字字符串。

因此我的第一次尝试是

apt-file search --regexp .*ssl.*\.so.*
Run Code Online (Sandbox Code Playgroud)

然而,这给了我这样的结果

机智的例子:/usr/lib/Wt/examples/feature/client-ssl-auth/resources

文件名中没有“.so”。

我玩了一下,想出了

apt-file search --regexp .*ssl.*\\.so.*
Run Code Online (Sandbox Code Playgroud)

即我逃脱了应该逃脱点的反斜杠。这给了我想要的结果。

有人可以解释为什么在这种情况下我需要双反斜杠吗?

con*_*use 5

您需要双反斜杠,\\因为单反斜杠不仅是正则表达式转义字符,也是您的 shell 使用的字符。例如,您对点进行转义,它在 shell 级别只是解释为常规点,然后将其传递给 apt-get 并匹配每个字符(就像常规点通常所做的那样)。

因此,答案是,首先将字符串由外壳,其中反斜杠只有一种含义的解释,以及之后的是,它被传递给apt-get的。apt-get 的正则表达式引擎然后再次解释预处理过的字符串。那里的反斜杠已被替换(并且含义也略有不同)。

另一种解决方案是将正则表达式放在引号中,如下所示:

apt-file search --regexp '.*ssl.*\.so.*'
Run Code Online (Sandbox Code Playgroud)