Ich möchte Zeilen in Dateien finden, in denen ein Muster vorkommt und ein anderes Muster fehlt. Zum Beispiel muss ich alle Dateien / Zeilen finden, loom
außer denen mit gloom
. Also kann ich loom
mit Befehl finden:
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
Jetzt möchte ich loom
ausschließen suchen gloom
. Beide der folgenden Befehle sind jedoch fehlgeschlagen:
grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp)
Was soll ich tun, um mein Ziel zu erreichen?
EDIT 1: Ich meine dasloom
undgloom
sind die Zeichenfolgen (nicht unbedingt die Wörter). So brauche ich zum Beispielbloomberg
in der Befehlsausgabe und brauche nichtungloomy
.
EDIT 2: Es gibt eine Stichprobe meiner Erwartungen. Beide der folgenden Zeilen befinden sich in der Befehlsausgabe:
Ich konfrontiert die Symbole , die ragte durch den Schleier von Weihrauch.
Arty dämmert an einem düsteren Tag.
Die beiden folgenden Zeilen sind nicht in der Befehlsausgabe enthalten:
Es ist düster, schrecklich - große Mistkerle von Cloods.
In der südwestlichen Runde der Heigh Pyntit Hall
there is a loom in the gloom
wäre - möchten Sie, dass diese Zeile gedruckt wird? Ich versuche nur zu verstehen, ob Sie nur nach Linien suchen, bei denen der Webstuhl nicht als Teil der Dunkelheit auftritt, oder ob Sie Linien, die die Dunkelheit enthalten, wirklich ausschließen möchten, selbst wenn der Webstuhl an einer anderen Stelle in der Linie eigenständig erscheint. Das Posten von Beispieleingaben und erwarteten Ausgaben würde helfen.How do I find lines containing the string "loom" where "loom" is not preceded by the letter "g"
? Wenn Sie einige Beispieleingaben und die gewünschte Ausgabe gepostet hätten, hätte dies sehr geholfen. Die Antwort auf diese Frage finden Sie in den Antworten unten.loom
ohne Vorzeichen vorkommtg
. (Es tut mir leid. Ich habe gestern angefangen zu kommentieren, bin aber nie fertig geworden. Aus Versehen wurde dieser Kommentar gesendet.)Antworten:
Wie wäre es einfach die Greps zu verketten?
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
quelle
bloomberg
in der Befehlsausgabe und brauche nichtungloomy
. Wenn eine einzelne Zeile "... und Bloomberg ist düster in Bezug auf die Aussichten ..." enthält, würden Sie diese Zeile entfernen, aber sie ist erwünscht (denn wenn sie enthältbloomberg
).Eine andere Lösung ohne Verkettung
grep
:egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
In Klammern schließen Sie das Zeichen
g
vor jedem Auftreten von ausloom
, esloom
sei denn, es handelt sich um die ersten Zeichen der Zeile.quelle
Ein bisschen alt, aber na ja ...
Die am besten gewählte Lösung von @houbysoft funktioniert nicht, da dadurch keine Zeile mit "Finsternis" ausgeschlossen wird, selbst wenn sie "Webstuhl" enthält. Gemäß den Erwartungen von OP müssen wir Linien mit "Webstuhl" einfügen, auch wenn sie auch "Trübsinn" enthalten. Diese Zeile muss in der Ausgabe "Arty dämmert an einem düsteren Tag" stehen, dies wird jedoch durch ein verkettetes Grep wie ausgeschlossen
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
Stattdessen funktioniert das egrep-Regex- Beispiel von Bentoy13 besser
egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
da es jede Zeile mit "Webstuhl" enthält, unabhängig davon, ob es "Finsternis" hat oder nicht. Auf der anderen Seite wird es, wenn es nur düster ist, es nicht einschließen, was genau das Verhalten ist, das OP will.
quelle
Verwenden Sie einfach awk, es ist viel einfacher als grep, wenn Sie zusammengesetzte Bedingungen klar ausdrücken können.
Wenn Sie möchten , Zeilen überspringen, enthält beide
loom
undgloom
:awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
oder wenn Sie sie drucken möchten:
awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
und wenn die Realität ist, wollen Sie nur Zeilen, in denen
loom
ein Wort für sich erscheint:awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)
quelle
abc
unddef
undghi
in beliebiger Reihenfolge. Vergleichen Sie das jetzt mitawk '/abc/ && /def/ && /ghi/'
. Denken Sie nun darüber nach, wie das grep-Äquivalent vonawk '/loom/ && !/gloom/'
in den Antworten auf dieser Seite geschrieben wird.condition { action }
Syntax überwunden werden muss, aber dann ist es ein Kinderspiel für alle, die C- oder andere Algol- basierte Spracherfahrungen haben.grep -Hn --color
:awk '/loom/ && !/gloom/ { gsub(/loom/, color("1;31") "&" color(0)); print color(35) FILENAME color(36) ":" color(32) FNR color(36) ":" color(0) $0; }; function color(c) { return "\033[" c "m"; }'
-v
ist das Flag "Inverted Match", daher ist Piping ein sehr guter Weg:grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"
quelle
/ * Du siehst vielleicht so aus?
grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)`
Die BACKQUOTES werden wie Klammern für Befehle verwendet. In diesem Fall
-l
gibt der Code in den BACKQUOTES bei Aktivierung die Dateinamen zurück und dann mit -vn, um das zu tun, was Sie wollten: Dateinamen, Leinenzahlen und auch die tatsächlichen Zeilen.UPDATE Oder mit xargs
grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom"
Hoffentlich hilft das.*/
Bitte ignorieren Sie, 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
quelle
Sie können
grep -P
(Perl Regex) unterstützt verwendennegative lookbehind
:grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)
Ich habe
\b
für Wortgrenzen hinzugefügt .quelle
\([^g]\|^\)
funktioniert. Und dies schließt Zeilen mitloom
und nicht ausgloom
.not gloom
.bloomberg
in der Befehlsausgabe und brauche nichtungloomy
. Somit sind die Wortgrenzen kontraproduktiv.grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'
quelle
bloomberg
in der Befehlsausgabe und brauche nichtungloomy
. Wenn eine einzelne Zeile "... und Bloomberg ist düster in Bezug auf die Aussichten ..." enthält, würden Sie diese Zeile entfernen, aber sie ist erwünscht (denn wenn sie enthältbloomberg
).Einfach benutzen!
grep -v
mehrmals.Inhalt der Datei
[root@server]# cat file 1 2 3 4 5
Schließen Sie die Linie oder Übereinstimmung aus
[root@server]# cat file |grep -v 3 1 2 4 5
Schließen Sie die Linie aus oder stimmen Sie mit mehreren überein
[root@server]# cat file |grep -v 3 |grep -v 5 1 2 4
quelle
Frage: Suche nach 'Webstuhl' ohne 'Finsternis'.
Antworten:
grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
quelle
bloomberg
in der Befehlsausgabe und brauche nichtungloomy
. Ich denke nicht, dass dies-w
die Lösung für dieses Rätsel ist.