![正则表达式 grep ^[^a]*$](https://linux22.com/image/162927/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%20grep%20%5E%5B%5Ea%5D*%24.png)
在这个目录里面
mael@mael-HP:~/repertoireVide$
是一个名为 MySQLServe 的文件,其中包含单词 violon 和 avion:
mael@mael-HP:~/repertoireVide$ cat MySQLServ
violon avion
为什么这些 grep 命令会应用于当前目录
$ grep -r ^[^a]*$
$ grep -r '^[^a]*$'
不给出任何输出?
[^a] 后面的 ^ 应avion
在搜索中省略,但参数的 *$ 部分应接受具有任何可能结尾的任何其他单词。为什么violon
这里被排除呢?
谢谢。
答案1
您不会得到任何结果,因为您的正则表达式^[^a]*$
(应在第二次尝试中使用单引号引起来)匹配仅包含非a
字符(或空行)的行,并且您的文本字符串不为空,并且它确实包含一个a
.
在本例中 ,它*
作用于前一个表达式。将匹配零个或多个非字符。由于您将表达式锚定到该行的开头和结尾,因此它会拒绝任何包含字母 的行。[^a]
[^a]*
a
a
对于grep
以非 开头的行a
,请使用
grep -r '^[^a]' .
请注意,不必显式匹配整行,但如果您想这样做,请使用
grep -r '^[^a].*$' .
.*
匹配零个或多个任何字符(包括a
)。
还要在输出中获取空行(这些显然不以 开头a
):
grep -r -v '^a' .
也就是说,a
在行的开头匹配 an 并使用 反转匹配的含义-v
。这样,一行中根本不需要任何字符(请注意,要匹配[^a]
,必须至少有一个字符),但如果有一些字符,第一个字符不应该是a
。
要搜索字不以 开头a
,使用
grep -r -w -o '[^a][[:alpha:]]*' .
该表达式匹配以 以外的内容开头a
,然后以零个或多个字母字符继续的任何内容。-w
GNU 的选项将grep
匹配限制为单词,并且该-o
选项要求grep
仅从每行中提取匹配部分。