Odpowiedzi:
Możesz to zrobić za pomocą opcji -v(for --invert-match) grep jako:
grep -v "unwanted_word" file | grep XXXXXXXX
grep -v "unwanted_word" fileodfiltruje linie, które mają unwanted_wordi grep XXXXXXXXwyświetli tylko linie ze wzorem XXXXXXXX.
EDYTOWAĆ:
Z twojego komentarza wygląda na to, że chcesz wymienić wszystkie linie bez unwanted_word. W takim przypadku wszystko czego potrzebujesz to:
grep -v 'unwanted_word' file
-v 'unwanted_word' --after Nnie pomaga, ponieważ OBEJMUJE linię i N linii po.
-vlub --invert-matchwybierz niepasujące linie. W twoim przypadku grep -v 'unwanted_word' filelub grep --invert-match 'unwanted_word' file.
git status -s |grep -v "folder_I_dont_care"
sun, z wyjątkiem gdy jest to sunrise, grep sun|grep -v sunrisepomija linię, która zawiera zarówno suni sunriseod razu, że nie jest to, co chcę. grep -P 'sun(?!rise)'jest znacznie lepszy.
Zrozumiałem pytanie jako „Jak dopasować słowo, ale wykluczyć inne”, dla którego jednym rozwiązaniem są dwa grep w szeregu: Pierwsze grep znajdowanie poszukiwanego „słowa 1”, drugie grep z wyłączeniem „słowa 2”:
grep "word1" | grep -v "word2"
W moim przypadku: muszę rozróżnić „plot” i „#plot”, którego opcja „word” grepa nie zrobi („#” nie jest alfanumeryczny).
Mam nadzieję że to pomoże.
word1.
Jeśli grepwspierasz wyrażenie regularne Perla z -Popcją, możesz to zrobić (jeśli bash; jeśli tcsh będziesz musiał uciec !):
grep -P '(?!.*unwanted_word)keyword' file
Próbny:
$ cat file
foo1
foo2
foo3
foo4
bar
baz
Wymieńmy teraz wszystkie fooopróczfoo3
$ grep -P '(?!.*foo3)foo' file
foo1
foo2
foo4
$
grep -v -Pdziała również bez negacji w wyrażeniach regularnych.
!” . Dziekuję Dziekuję Dziękuję! Właśnie tego chciałem!
Właściwym rozwiązaniem jest użycie grep -v "word" file, z jego awkodpowiednikiem:
awk '!/word/' file
Jednakże, jeśli zdarzy ci się mieć bardziej złożoną sytuację, w której chcesz, powiedzmy, XXXpojawiać się, a YYY nie pojawiać, wtedy awkprzydaje się zamiast sipowania kilku greps:
awk '/XXX/ && !/YYY/' file
# ^^^^^ ^^^^^^
# I want it |
# I don't want it
Możesz nawet powiedzieć coś bardziej złożonego. Na przykład: chcę te linie zawierające albo XXXalbo YYY, ale nie ZZZ:
awk '(/XXX/ || /YYY/) && !/ZZZ/' file
itp.
grep -Prozwiązanie dla dużych plików.
grep -Poznacza użycie wyrażenia regularnego Perla, więc ładowanie tego pakietu będzie znacznie droższe niż normalnie grep.
grep zapewnia opcję „-v” lub „--invert-match”, aby wybrać niepasujące linie.
na przykład
grep -v 'unwanted_pattern' file_name
Spowoduje to wypisanie wszystkich wierszy z pliku nazwa_pliku, który nie ma „niepożądanego_zakładu”.
Jeśli przeszukujesz wzorzec w wielu plikach w folderze, możesz użyć opcji wyszukiwania rekurencyjnego w następujący sposób
grep -r 'wanted_pattern' * | grep -v 'unwanted_pattern'
Tutaj grep spróbuje wyświetlić wszystkie wystąpienia „Want_pattern” we wszystkich plikach z bieżącego katalogu i przekazać go do drugiego grep, aby odfiltrować „niepożądany_pattern”. „|” - pipe powie powłoce, aby połączyła standardowe wyjście lewego programu (grep -r 'Want_pattern' *) ze standardowym wejściem prawego programu (grep -v 'niepożądany_pattern').
Mam katalog z wieloma plikami. Chcę znaleźć wszystkie pliki, które NIE zawierają ciągu „przyspieszenie”, więc z powodzeniem użyłem następującego polecenia:
grep -iL speedup *
grep -Rv "word_to_be_ignored" . | grep "word_to_be_searched"