确定要发生什么吗?在运行时,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匹配,因此只有它们打印出来。
grepterm开头的行。或者,您是否想对根本不包含term的行进行grep?