我经常使用locate
(from findutils
) 的以下管道并grep
查找路径名包含两个单词word1
and的文件word2
,彼此之间没有任何特定顺序:
locate -i word1 | grep -i word2
我想知道如何仅使用单个非管道命令来做到这一点?它比我的管道命令更好吗?
是否locate
支持一些正则表达式,我们可以在其中制定我的搜索模式?
谢谢。
我经常使用locate
(from findutils
) 的以下管道并grep
查找路径名包含两个单词word1
and的文件word2
,彼此之间没有任何特定顺序:
locate -i word1 | grep -i word2
我想知道如何仅使用单个非管道命令来做到这一点?它比我的管道命令更好吗?
是否locate
支持一些正则表达式,我们可以在其中制定我的搜索模式?
谢谢。
这在很大程度上取决于您对
locate
. 这不是标准命令,并且有一些不同的实现具有相当大的差异。GNU findutils 中有一个实现。
有了那个:
查找路径包含
word1
或word2
不区分大小写的文件,而定位路径包含两者的文件。
它还支持GNU 的
--regex
and选项。默认情况下,那是-style 正则表达式,是 BRE 和 ERE 之间的某种混合形式。--regextype
find
emacs
有了那个,你可以这样做:
mlocate
实现(Debian 和衍生产品的默认设置)也支持-A
. 它有-r
/--regex
,但没有--regextype
,它的 RE 是基本正则表达式。在像 GNU 这样的系统上,其 BRE 支持\|
交替作为扩展,您还可以执行以下操作:ast-open 有一个
locate
以及一个 ksh93 包装脚本tw
(曾经是 的继任者find
)。它不支持-A
nor-r
,但您可以使用ksh93
通配符的全部功能,因此您可以使用类似 perl 的前瞻运算符:Or
ksh93
的&
全局运算符:与其他模式相比,它特别慢,因为模式没有锚定。一旦锚定(
l
eft和r
ight)通过以下方式恢复,效果会更好:管道传输的一个问题
grep
是它不适用于包含换行符的文件路径。使用 GNU locate 或 mlocate,您可以使用该-0
选项来使用 NUL 分隔的记录,您可以将其与-z
GNU 的选项结合使用grep
:或者
-v RS='\0'
在 GNU gawk 或 @ThomasDickey's 中mawk
:或者
perl -ln0
: