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

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

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

假设两个文件/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

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

apache2-bin: /usr/lib/apache2/modules/httpd.exp

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

答案1

问题与文件源apt-file匹配有关。它使用内容文件/var/lib/apt/列表/,不包含前导的/

# 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

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

# 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

它之所以起作用apache2-bin: /usr/lib/apache2/modules/httpd.exp是因为apt-file它照顾了前导斜杠并在搜索模式中将其删除。

但这只适用于模式的开头,它不能识别或者操作符,并且不会从中删除前导斜杠第二搜索部分。第二个搜索部分/usr/lib/apt/apt.systemd.daily不匹配,因为内容文件。


附录

  • 正如 N0rbert 所提到的apt-file --regexp那样Perl 正则表达式
  • 相关部分来自apt-file 命令概述了这个问题的问题漏洞和怪癖部分

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

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

相关内容