108 votes

Comment grep, en excluant certains motifs ?

J'aimerais trouver les lignes dans les fichiers avec une occurrence d'un certain modèle et une absence d'un autre modèle. Par exemple, j'ai besoin de trouver tous les fichiers/lignes comprenant loom sauf ceux qui ont gloom . Donc, je peux trouver loom avec commandement :

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

Maintenant, je veux chercher loom à l'exclusion de gloom . Cependant, les deux commandes suivantes ont é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 y gloom sont les séquences de caractères (pas nécessairement les mots). J'ai donc besoin, par exemple, de bloomberg dans la sortie de la commande et n'ont pas besoin de ungloomy .

EDIT 2 : Il y a un échantillon de mes attentes. Les deux lignes suivantes sont dans la sortie de commande :

J'ai fait face aux icônes que tissé à travers le voile de l'encens.

Arty est (en anglais) dans un sombre jour.

Les deux lignes suivantes ne sont pas dans la sortie de commande :

C'est lugubre C'est terrible - de grands faiseurs de cloches.

Dans le rond sud-ouest de la salle du Heigh Pyntit.

6voto

Tiborcz Kiss Points 61

Il suffit de l'utiliser ! grep -v plusieurs fois.

Contenu du dossier

[root@server]# cat file
1
2
3
4
5

Exclure la ligne ou la correspondance

[root@server]# cat file |grep -v 3
1
2
4
5

Exclure la ligne ou faire correspondre plusieurs

[root@server]# cat file |grep -v 3 |grep -v 5
1
2
4

5voto

Juto Points 403

/*Vous cherchez peut-être quelque chose comme ça ?

grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)`

Les BACKQUOTES sont utilisés comme des parenthèses pour les commandes, donc dans ce cas avec -l activé, le code dans les BACKQUOTES vous renverra les noms de fichiers, puis avec -vn pour faire ce que vous vouliez : avoir les noms de fichiers, les numéros de lignes, et aussi les lignes réelles.

UPDATE Ou avec xargs

grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom"

J'espère que ça vous aidera.

S'il vous plaît, ignorez ce que j'ai écrit ci-dessus, c'est n'importe quoi.

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

4voto

anubhava Points 172509

Vous pouvez utiliser grep -P (perl regex) supporté negative lookbehind :

grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)

J'ai ajouté \b pour les limites des mots.

3voto

Jim Points 2789
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

0voto

Abhinandan Points 11

Question : recherchez "loom" à l'exclusion de "gloom".
Réponse :

grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X