如何用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
$
相關文章
相關標籤/搜索