正则表达式 grep ^[^a]*$

正则表达式 grep ^[^a]*$

在这个目录里面

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]*aa

对于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,然后以零个或多个字母字符继续的任何内容。-wGNU 的选项将grep匹配限制为单词,并且该-o选项要求grep仅从每行中提取匹配部分。

相关内容