确定要发生什么吗?在运行时,ls /directory | grep '[^term]'
您实际上不是在拼写字母t的字母。这意味着,如果文件名中包含其他字母,则该文件仍会出现在的输出中ls
。以以下目录为例:
$ ls
alpha brave bravo charlie delta
现在,如果我运行,ls |grep '^[brav]'
我将得到以下信息:
$ ls |grep '^[brav]'
alpha
brave
bravo
如您所见,我不仅得到了,brave
而且bravo
我也得到了,alpha
因为角色类[]
将从该列表中获取任何字母。
因此,如果我运行,ls |grep '[^brav]'
我将获得名称中任何地方都不包含brav字符的所有文件。
$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta
如果您注意到它包含了整个目录列表,因为所有文件中至少有一个字母未包含在字符类中。
因此,正如Kanvuanza所说,要将grep替换为“ term”(而不是字符),t e r m
您应该使用grep -v
。
例如:
$ ls |grep -v 'brav'
alpha
charlie
delta
另外,如果您不希望使用类中包含任何字符的文件grep -v '[term]'
。这样可以避免显示具有任何这些字符的任何文件。(Kanvuanza的答案)
例如:
$ ls |grep -v '[brav]'
如您所见,没有列出文件,因为此目录中的所有文件至少包含该类的一个字母。
附录:
我想补充一点,使用PCRE可以只使用正则表达式来过滤否定表达式。为此,您可以使用称为负前瞻正则表达式的东西:(?!<regex>)
。
因此,使用上面的示例,您可以执行类似的操作来获得所需的结果,而无需使用grep
标志。
$ ls | grep -P '^(?!brav)'
alpha
charlie
delta
要解构该正则表达式,它首先在一行的开头匹配^
,然后查找不匹配的字符串,brav
之后再跟随。只有alpha
,charlie
和delta
匹配,因此只有它们打印出来。
grep
term开头的行。或者,您是否想对根本不包含term的行进行grep?