Lorsque j'exécute ls /directory | grep '[^term]'
dans Bash, j'obtiens une liste régulière, comme si la grep
commande était ignorée d'une manière ou d'une autre. J'ai essayé la même chose avec egrep
, j'ai essayé de l'utiliser avec des guillemets doubles et simples, mais sans meilleurs résultats. Lorsque j'essaie, ls /directory | grep '^[term]
j'obtiens toutes les entrées commençant par le terme - comme prévu.
J'ai essayé cette commande dans un éditeur en ligne, où je peux tester mon expression régulière et cela a fonctionné comme il se doit. Mais pas dans Bash. Cela fonctionne donc dans une simulation, mais pas dans la vraie vie.
Je travaille sur Crunchbang Linux 10. J'espère que ces informations sont suffisantes et j'attends avec impatience chaque indice, car ne pas exécuter à un niveau aussi basique et perdre des heures est vraiment frustrant!
grep
lignes commençant par un terme. Ou voulez-vous chercher des lignes ne contenant pas du tout de terme?Réponses:
Êtes-vous sûr que ce que vous voulez se passe? Lorsque vous courez,
ls /directory | grep '[^term]'
vous ne cherchez pas essentiellement les lettres ter m. Cela signifie que si un fichier a d'autres lettres dans son nom, il apparaîtra toujours dans la sortie dels
. Prenez par exemple le répertoire suivant:Maintenant, si je cours,
ls |grep '^[brav]'
j'obtiens ce qui suit:Comme vous pouvez le voir, non seulement j'ai reçu
brave
etbravo
j'ai aussi obtenualpha
parce que la classe de personnage[]
recevra n'importe quelle lettre de cette liste.Par conséquent, si je lance
ls |grep '[^brav]'
, j'obtiendrai tous les fichiers qui ne contiennent pas les caractères brav n'importe où dans le nom.Si vous remarquez qu'il comprenait la liste complète des répertoires car tous les fichiers avaient au moins une lettre qui n'était pas incluse dans la classe de caractères.
Donc, comme Kanvuanza l'a dit, pour rechercher l'inverse de "terme" par opposition aux caractères,
t e r m
vous devez le faire en utilisantgrep -v
.Par exemple:
Aussi, si vous ne voulez pas que les fichiers contenant des caractères dans la classe soient utilisés
grep -v '[term]'
. Cela empêchera l'apparition de tous les fichiers contenant l'un de ces caractères. (Réponse de Kanvuanza)Par exemple:
Comme vous pouvez le voir, aucun fichier n'était répertorié car tous les fichiers de ce répertoire comprenaient au moins une lettre de cette classe.
Addenda:
Je voulais ajouter qu'en utilisant PCRE, il est possible d'utiliser simplement des expressions rationnelles pour filtrer en utilisant des expressions négatives. Pour ce faire , vous utilisez quelque chose de connu comme anticipation négative regex:
(?!<regex>)
.Donc, en utilisant l'exemple ci-dessus, vous pouvez faire quelque chose comme ça pour obtenir les résultats souhaités sans utiliser de
grep
drapeaux.Pour déconstruire cette expression régulière, elle correspond d'abord au début d'une ligne
^
, puis recherche les chaînes qui ne correspondent pasbrav
à suivre ensuite. Seulementalpha
,charlie
etdelta
correspondent donc ce sont les seuls qui sont imprimés.la source
-v
option. Merci pour votre aide! Cette question a vraiment gâché mon après-midi, où votre réponse égaye ma soirée!negative look-ahead regex
.Je suppose que ce
grep -v
drapeau fait ce que vous voulez. Depuis la page de manuel :Vous pouvez utiliser
ls /directory | grep -v [term]
pour imprimer toutes les lignes qui ne correspondent pas.la source
[^abc]
Mais je suis à peu près sûr que grep ne prend pas en charge les négations de classe, sauf quelques-unes standard (par exemple.[[:^digits:]]
). Le support de grep pour la négation est horrible !grep
la gestion des classes de caractères est très bien. Cela signifie simplement quelque chose de très différent de ce que vous (mal) comprenez.[abc]
des moyens de unea
,b
ouc
;[^abc]
signifie tout sauf ce qui précède. C'est un personnage.