apt-file regex:使用或一次查找多个包

Kar*_*ter 4 apt regex apt-file

我想使用带有逻辑 or 的正则表达式连接模式一次搜索多个包|

假设这两个文件/usr/lib/apache2/modules/httpd.exp/usr/lib/apt/apt.systemd.daily存在:

$ sudo dpkg -S /usr/lib/apache2/modules/httpd.exp
apache2-bin: /usr/lib/apache2/modules/httpd.exp
$ sudo dpkg -S /usr/lib/apt/apt.systemd.daily
apt: /usr/lib/apt/apt.systemd.daily
Run Code Online (Sandbox Code Playgroud)

为什么apt-file search --regexp '/usr/lib/apache2/modules/httpd.exp|/usr/lib/apt/apt.systemd.daily'只返回

apache2-bin: /usr/lib/apache2/modules/httpd.exp
Run Code Online (Sandbox Code Playgroud)

该解决方案旨在用于优化 GNOME 构建工具jhbuild。它应该适用于大量的 Ubuntu 版本。

Tho*_*mas 7

问题与文件源apt-file是否匹配有关。它使用/var/lib/apt/lists/ 中Contents文件,其中不包含前导./

# lz4cat /var/lib/apt/lists/de.archive.ubuntu.com_ubuntu_dists_bionic_Contents-amd64.lz4 | grep httpd.exp
usr/lib/apache2/modules/httpd.exp               httpd/apache2-bin
usr/share/doc/lighttpd/expire.txt               universe/web/lighttpd-doc
Run Code Online (Sandbox Code Playgroud)

因此,只需跳过正则/表达式中的前导,就可以了。我还建议对点进行转义,\.因为 `.* 仅表示匹配任何字符。在这种情况下,它可能会给您预期的结果,但这仅仅是因为没有其他匹配项。

# apt-file search --regexp 'usr/lib/apache2/modules/httpd\.exp|usr/lib/apt/apt\.systemd\.daily'
apache2-bin: /usr/lib/apache2/modules/httpd.exp
apt: /usr/lib/apt/apt.systemd.daily
Run Code Online (Sandbox Code Playgroud)

它之所以起作用的原因apache2-bin: /usr/lib/apache2/modules/httpd.exp是因为apt-file处理前导斜杠并在搜索模式中删除它们。

但这仅适用于模式的开头,它不识别or运算符,也不会从第二个搜索部分中删除前导斜杠。/usr/lib/apt/apt.systemd.daily由于Contents文件中缺少前导斜杠,因此第二个搜索部分不匹配。


附录

  • 正如 N0rbert 所提到的,apt-file --regexp正在使用Perl 正则表达式
  • man apt-file的相关部分在BUGS, QUIRKS部分概述了这个问题的问题

    内容文件在路径上不包含前导斜杠。这意味着 /bin/ls 在 Contents 文件中列为 bin/ls。如果您正在顶级目录中查找某些内容,通常最好省略前导斜杠。

    搜索算法将尝试绕过前导斜杠,但并非在所有情况下都有效。作为一种解决方法,尝试将前导斜杠拉到正则表达式的开头。例如,使用“/(?:usr/bin/vim|sbin/lvm)”而不是“/usr/bin/vim|/sbin/lvm”。