我想使用带有逻辑或的正则表达式连接模式一次搜索多个包|
。
假设两个文件/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”。