it-swarm.com.de

Wie greife ich, ohne einige Muster?

Ich möchte Zeilen in Dateien finden, in denen ein Muster vorkommt und in denen ein anderes Muster fehlt. Zum Beispiel muss ich alle Dateien/Zeilen einschließlich loom finden, mit Ausnahme derjenigen mit gloom. Also kann ich loom mit folgendem Befehl finden:

grep -n 'loom' ~/projects/**/trunk/src/**/*[email protected](h|cpp)

Jetzt möchte ich nach loom ohne gloom suchen. Die beiden folgenden Befehle sind jedoch fehlgeschlagen:

grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*[email protected](h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*[email protected](h|cpp)

Was soll ich tun, um mein Ziel zu erreichen?

EDIT 1:Ich meine, dass loom und gloom die Zeichenfolgen sind (nicht unbedingt die Wörter). Also brauche ich zum Beispiel bloomberg in der Befehlsausgabe und brauche ungloomy nicht.

EDIT 2:Es gibt Beispiele für meine Erwartungen. Die beiden folgenden Zeilen befinden sich in der Befehlsausgabe:

Ich stand den Ikonen gegenüber, die aufragend durch den Weihrauchschleier ragten.

Arty ist düster an einem düsteren Tag.

Die beiden folgenden Zeilen sind nicht in der Befehlsausgabe enthalten:

Es ist düster schrecklich - großartige Muckle Doolders of the Cloods.

Im Südwesten rund um die Höhensyntithalle

62
Loom

Wie wäre es, die Greps zu verketten?

grep -n 'loom' ~/projects/**/trunk/src/**/*[email protected](h|cpp) | grep -v 'gloom'
82
houbysoft

Eine andere Lösung ohne Verkettung von grep:

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*[email protected](h|cpp)

In Klammern schließen Sie das Zeichen g vor jedem Auftreten von loom aus, es sei denn, loom ist die ersten Zeichen der Zeile.

15
Bentoy13

Ein bisschen alt, aber na ja ...

Die am meisten gewählte Lösung von @houbysoft wird nicht funktionieren, da dadurch jede Zeile mit "Gloom" ausgeschlossen wird, selbst wenn sie "Webstuhl" hat. Entsprechend den Erwartungen von OP müssen Zeilen mit "Webstuhl" eingefügt werden, auch wenn sie auch "Trübsinn" haben. Diese Zeile muss in der Ausgabe stehen "Arty droht an einem düsteren Tag.", Aber dies wird durch ein verkettetes grep like ausgeschlossen 

grep -n 'loom' ~/projects/**/trunk/src/**/*[email protected](h|cpp) | grep -v 'gloom'

Stattdessen funktioniert das egrep regex Beispiel von Bentoy13 besser 

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*[email protected](h|cpp)

da es jede Zeile mit "Webstuhl" enthält, unabhängig davon, ob sie "Trübsinn" hat oder nicht. Auf der anderen Seite, wenn es nur Düsternis gibt, wird es nicht einbezogen, was genau das Verhalten ist, das OP wünscht.

8
Sam

Verwenden Sie einfach awk, es ist viel einfacher als grep, wenn Sie die zusammengesetzten Bedingungen klar ausdrücken lassen.

Wenn Sie Zeilen überspringen möchten, die sowohl loom als auch gloom enthalten:

awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*[email protected](h|cpp)

oder wenn Sie sie ausdrucken möchten:

awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*[email protected](h|cpp)

und wenn die Realität ist, willst du nur Zeilen, in denen loom als Wort für sich erscheint:

awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*[email protected](h|cpp)
7
Ed Morton

-v Ist das "inverted match" -Flag, also ist Piping ein sehr guter Weg:

grep "loom" ~/projects/**/trunk/src/**/*[email protected](h|cpp)| grep -v "gloom"

6
Oleg Kokorin

/ * Sie sehen so ähnlich aus?

grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*[email protected](h|cpp)`

Die BACKQUOTES werden wie Klammern für Befehle verwendet. In diesem Fall werden dann mit -l enabled, Der Code in den BACKQUOTES die Dateinamen zurückgegeben, dann mit -vn, um das zu tun, was Sie wollen: Dateinamen, Leinennummern und auch tatsächliche Zeilen. 

UPDATEOder mit xargs

grep -l "loom" ~/projects/**/trunk/src/**/*[email protected](h|cpp) | xargs grep -vn "gloom"

Hoffentlich hilft das.*/

Bitte ignoriere, was ich oben geschrieben habe, es ist Müll. 

grep -n "loom" `grep -l "loom" tt4.txt` | grep -v "gloom"

               #this part gets the filenames with "loom"
#this part gets the lines with "loom"
                                          #this part gets the linenumber,
                                          #filename and actual line
5
Juto

Sie können grep -P (Perl regex) unterstützt negative lookbehind verwenden:

grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*[email protected](h|cpp)

Ich habe \b für Word-Grenzen hinzugefügt.

4
anubhava
grep -n 'loom' ~/projects/**/trunk/src/**/*[email protected](h|cpp) | grep -v 'gloom'
3
Jiminion

Einfach nutzen! grep -v mehrmals.

Inhalt der Datei

[[email protected]]# cat file
1
2
3
4
5

Schließen Sie die Zeile oder Übereinstimmung aus

[[email protected]]# cat file |grep -v 3
1
2
4
5

Schließen Sie die Zeile aus oder stimmen Sie mit mehreren überein

[[email protected]]# cat file |grep -v 3 |grep -v 5
1
2
4
1
Tiborcz Kiss

Frage: Suche nach 'Webstuhl' außer 'Trübsinn'. 
Antworten:

grep -w 'loom' ~/projects/**/trunk/src/**/*[email protected](h|cpp)
0
Abhinandan