如何用grep排除一个单词?

我须要这样的东西: 正则表达式

grep ^"unwanted_word"XXXXXXXX

#1楼

我将这个问题理解为“如何匹配一个单词但排除另外一个单词”,其中一个解决方案是两个greps系列:第一个grep找到想要的“word1”,第二个grep排除“word2”: shell

grep "word1" | grep -v "word2"

在个人状况下:我须要区分grep的“word”选项不会作的“plot”和“#plot”(“#”不是字母数字)。 bash

但愿这能够帮助。 spa


#2楼

grep提供'-v'或'--invert-match'选项来选择不匹配的行。 code

例如 递归

grep -v 'unwanted_pattern' file_name

这将输出文件file_name中的全部行,该行没有'unwanted_pa​​ttern'。 ip

若是要在文件夹内的多个文件中搜索模式,可使用递归搜索选项,以下所示 字符串

grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'

这里grep将尝试列出当前目录中全部文件中'wanted_pa​​ttern'的全部匹配项,并将其传递给第二个grep以过滤掉'unwanted_pa​​ttern'。 '|' - pipe将告诉shell将左程序的标准输出(grep -r'want_pattern'*)链接到正确程序的标准输入(grep -v'wiscory_pattern')。 it


#3楼

正确的解决方案是使用grep -v "word" file ,其awk等效: pip

awk '!/word/' file

可是,若是你碰巧遇到了一个更复杂的状况,好比说XXX出现而YYY 没有出现,那么awk会派上用场而不是管道好几个grep

awk '/XXX/ && !/YYY/' file
#    ^^^^^    ^^^^^^
# I want it      |
#            I don't want it

你甚至能够说一些更复杂的东西。 例如:我想要那些包含XXXYYY但不包含ZZZ

awk '(/XXX/ || /YYY/) && !/ZZZ/' file

等等


#4楼

我有一堆文件的目录。 我想找到全部不包含字符串“speedup”的文件,因此我成功使用了如下命令:

grep -iL speedup *

#5楼

若是你的grep支持使用-P选项的Perl正则表达式,你能够这样作(若是是bash;若是tcsh你须要转义! ):

grep -P '(?!.*unwanted_word)keyword' file

演示:

$ cat file
foo1
foo2
foo3
foo4
bar
baz

如今让咱们列出除foo3以外的全部foo

$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
相关文章
相关标签/搜索