grep
我在运行五次时观察到以下行为:
me@asus:~/go/src/company/topology-front$ lsof |grep 'READ'
vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp
me@asus:~/go/src/company/topology-front$ lsof |grep 'README.md*'
vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp
me@asus:~/go/src/company/topology-front$ lsof |grep 'README.md'
vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp
me@asus:~/go/src/company/topology-front$ lsof |grep '*README.md*'
me@asus:~/go/src/company/topology-front$ lsof |grep '*README.md'
me@asus:~/go/src/company/topology-front$
我不明白为什么最后两次尝试grep
没有返回任何结果。
grep
模式是正则表达式(又名 regex、regexp、RE)、基本正则表达式 (BRE),除非使用-E
/-F
/-P
/-K
/-X
选项之一(只有前两个是标准的)。*
是一个正则表达式运算符,它匹配 0 个或多个前面的atom。例如,d*
匹配 0 个或多个d
s。在 BRE 中,当位于模式的开头或在^
or正则\(
表达式运算符之后时,它仅匹配文字*
(它也按字面意思放在[...]
括号表达式中)。因此
grep '*README.md*'
匹配包含文字*
后跟README
任何单个字符(正则.
表达式运算符)后跟m
任意数量的d
s 的行。由于任何数字都包含 0,因此在功能上等同于grep '*README.m'
(这对匹配哪些行没有影响,仅在行内可能匹配的内容上(例如,使用--color
GNU 的选项显示grep
))。例如,它将匹配这两行:
(
^
显示行内内容的 s 与正则表达式匹配,您可以使用 看到--color
)在这里,您似乎将正则表达式与 shell 通配符模式混淆了。匹配 0 个或多个字符的
*
通配符可以写成.*
正则表达式。但是做:将再次与以下内容相同:
As在行内
grep
查找匹配,而不是查找与模式完全匹配的行(您需要)。-x
使用 ast-open
grep
,它也是ksh93
'grep
内置的(默认情况下并不总是内置的,您需要通过将 放在/opt/ast/bin
前面来启用它$PATH
),您可以使用-K
选项grep
来使用 shell 通配符(扩展的 ksh93 通配符)。因此,通过该grep
实现,您可以执行以下操作:或者
匹配包含
README.md
.使用相同的实现,通配符匹配也可以在扩展 (
-E
)、增强(-X
) 或类似 perl (-P
) 的正则表达式中使用(?K)
运算符启用(以及\(?K\)
在实际上破坏 POSIX 一致性的基本正则表达式中,所以我不会依赖它因为它可能会在未来的版本中被删除)。所以你可以这样做:那里。
使用任何现代
grep
实现,您还可以执行以下操作:对于固定字符串搜索(
.
上面匹配文字.
而不是任何字符)。