Comment grep, à l'exclusion de certains modèles?
J'aimerais trouver des lignes dans des fichiers avec une occurrence de certains modèle et une absence de tout autre motif. Par exemple, j'ai besoin de trouver tous les fichiers/les lignes y compris loom
à l'exception de ceux avec gloom
. Donc, je peux trouver loom
avec la commande:
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
Maintenant, je veux rechercher loom
à l'exclusion de gloom
. Cependant, les deux commandes suivantes a échoué:
grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp)
Que dois-je faire pour atteindre mon objectif?
EDIT 1: je veux dire que loom
et gloom
sont les séquences de caractères (pas nécessairement les mots). Donc, j'ai besoin, par exemple, bloomberg
dans la sortie de commande et n'ont pas besoin ungloomy
.
EDIT 2: Il y a échantillon de de mes attentes.
Les deux lignes suivantes sont en sortie de commande:
J'ai affronté les icônes qui surgit à travers le voile de l'encens.
Arty est slooming dans un sombre jour.
Les deux lignes suivantes ne sont pas dans la sortie de commande:
C'est gloomyin’ de carthame terrible — grand muckle doolders o’ cloods.
Dans le sud-ouest de la tour de la hauteur pyntit hall
- Vous êtes à la recherche pour les fichiers qui correspondent à vos critères de lignes qui correspondent à vos critères?
- Je suis à la recherche de fichiers avec les lignes correspondant à mes critères. Et je veux voir la liste de tous les jeux de nom de fichier + le numéro de ligne correspondant + de correspondance de la ligne elle-même.
- Si la ligne a été
there is a loom in the gloom
, voudriez - vous que la ligne imprimée? Juste essayer de comprendre si vous êtes simplement à la recherche pour les lignes où le métier à tisser se produit autrement que dans le cadre de la tristesse ou si vous avez vraiment ne voulez exclure les lignes contenant des ténèbres, même lorsque métier à tisser apparaît sur son propre ailleurs sur la ligne. Poster quelques échantillons d'entrée et de sortie attendue pourrait l'aider. - Si votre question est vraiment
How do I find lines containing the string "loom" where "loom" is not preceded by the letter "g"
? Si tu avais posté quelques échantillons d'entrée et de sortie souhaité que aurait beaucoup aidé. La réponse à cette question est incluse dans les réponses ci-dessous. - Oui, vous avez raison, j'ai besoin de toutes les lignes, où se produit
loom
sans précédég
. (Je suis désolé. J'ai commencé à commenter hier, mais jamais fini. Accidentellement ce commentaire a été envoyé). - Au début de votre question, vous avez dit que vous voulez lignes avec un
loom
et à l'absence degloom
. Mais si votre Edit 2, le deuxième exemple de sortie, il est à la foisloom
dansslooming
etgloom
dansgloomy
jour, pourquoi? - J'ai ajouté Edit 2, car entendu que la formulation originale a été source de confusion.
- Je semble toujours être source de confusion pour moi, ce sont les réponses à partir de ci-dessous toutes les bonnes? Je peux voir quelques raisonnable chers?
- Oui, certaines réponses sont bonnes. Je n'ai pas à décider quel d'entre eux à accepter, encore.
Vous devez vous connecter pour publier un commentaire.
Que diriez-vous simplement chaînage de l'grep?
bloomberg
dans la sortie de commande et n'ont pas besoinungloomy
. Si une seule ligne de contenus " ... et bloomberg est ungloomy sur les perspectives...", vous permettrait de remédier à la ligne, mais c'est voulu (car si contientbloomberg
).Une autre solution sans chaînage
grep
:Entre parenthèses, vous exclure le caractère
g
avant toute survenance deloom
, à moins queloom
est les premiers caractères de la ligne.Un peu vieux, mais bon...
Le plus voté solution de @houbysoft ne fonctionnera pas comme qui excluent toute la ligne avec "tristesse", même si elle a "métier à tisser". Selon l'OP attentes, nous avons besoin d'inclure les lignes avec "métier à tisser", même si ils ont aussi des "ténèbres" dans les. Cette ligne doit être dans la sortie "Arty est slooming dans un jour sombre.", mais ce sera exclu par la chaîne, grep comme
Au lieu de cela, le egrep regex exemple de Bentoy13 fonctionne mieux
comme il comprendra toute la ligne avec le "métier à tisser" dans ce, indépendamment de si oui ou non il a "morosité". D'autre part, si ce n'est que de la morosité ambiante, il ne comprendra pas, ce qui est précisément le comportement de l'OP veut.
Suffit d'utiliser awk, il est beaucoup plus simple que grep en vous permettant de vous exprimer clairement composé conditions.
Si vous voulez sauter des lignes qui contient à la fois
loom
etgloom
:ou si vous souhaitez l'imprimer:
et si la réalité est, vous voulez juste les lignes où
loom
apparaît comme un mot par lui-même:abc
etdef
etghi
dans n'importe quel ordre. Maintenant, comparez cela àawk '/abc/ && /def/ && /ghi/'
. Maintenant, pensez à la façon dont le grep équivalent deawk '/loom/ && !/gloom/'
est écrit dans les réponses sur cette page.condition { action }
syntaxe, mais ensuite c'est un jeu d'enfant pour n'importe qui avec un C ou d'autres Algol-langue de base de l'expérience.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
est le "inversé match" drapeau, de sorte que la tuyauterie est une très bonne manière:grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"
/*Vous pourriez être à la recherche de quelque chose de ce genre?
Les BACKQUOTES sont utilisés comme supports pour les commandes, donc dans ce cas avec
-l
activé,le code dans les BACKQUOTES vous renvoie les noms de fichier, puis avec un -vn à faire ce que tu voulais: ont des noms de fichiers, numéros de lignes, et aussi de la lignes.
Mise à JOUR Ou avec xargs
Espère que ça aide.*/
S'il vous plaît ignorer ce que j'ai écrit ci-dessus, c'est de la foutaise.
Vous pouvez utiliser
grep -P
(expression rationnelle perl) pris en chargenegative lookbehind
:J'ai ajouté
\b
pour les limites de mot.\([^g]\|^\)
œuvres. Et cela n'exclut pas les lignes avec les deuxloom
etgloom
.not gloom
.bloomberg
dans la sortie de commande et n'ont pas besoinungloomy
. Ainsi, les limites de mots sont contre-productives.bloomberg
dans la sortie de commande et n'ont pas besoinungloomy
. Si une seule ligne de contenus " ... et bloomberg est ungloomy sur les perspectives...", vous permettrait de remédier à la ligne, mais c'est voulu (car si contientbloomberg
).Simplement utiliser!
grep -v
plusieurs fois.Le contenu du fichier
Exclure de la ligne ou d'un match
Exclure la ligne ou correspondre à de multiples
Question: la recherche pour "métier à tisser" - à l'exclusion 'tristesse'.
Réponse:
bloomberg
dans la sortie de commande et n'ont pas besoinungloomy
. je ne pense pas que-w
est la solution à cette énigme.