web-dev-qa-db-fra.com

Grep exclure les jokers qui ne fonctionnent pas

J'utilise Ubuntu 14.04 LTS.

Je joue avec grep et je suis tombé sur un problème qui passe de grep à ls. Tous les exemples sont limités à un répertoire en cours, non récursif.

Si je veux lister tous les fichiers contenant un chiffre dans leur nom:

ls | grep [0-9]

Si je veux lister tous les fichiers contenant "d", "h", "m" comme première lettre:

ls | grep ^[dhm]

Si je veux lister tous les fichiers contenant un chiffre comme première lettre:

ls | grep ^[0-9]

Cependant, lorsque j'essaie d'utiliser ! à l'intérieur de [], le ! n'est pas inclus:

user@Host:~$ ls | grep [0-9]
1.log
2.log
3.log
hs_err_pid4015.log
Untitled 1.odt
v1.odt

user@Host:~$ ls | grep [!0-9]
1.log
2.log
3.log
hs_err_pid4015.log
Untitled 1.odt
v1.odt

La même chose implique que si j'essaye de l'utiliser avec ^

user@Host:~$ ls | grep ^[0-9]
1.log
2.log
3.log

user@Host:~$ ls | grep ^[!0-9]
1.log
2.log
3.log

J'ai passé plusieurs jours à lire d'autres articles, pages de manuel, articles, etc. concernant grep et des caractères génériques, mais je n'arrive pas à le comprendre. J'ai essayé de les mettre dans ' et ", en combinant les deux balises joker (^ et !) dans [[]] etc.

Rien ne montre une sortie différente des exemples ci-dessus.

S'il te plaît, ne me montre pas la solution. Explique mes erreurs et laisse-moi le découvrir moi-même.

2
Iliyan Stankov

Le jeton Regex à l'intérieur de la classe de caractères pour la négation est ^, pas !.

Donc vous avez besoin de:

ls | grep '^[^0-9]'

Si vous faites ls | grep ^[!0-9], alors dans [], ! est traité littéralement et 0-9 est développé de la manière habituelle.

Également pour ce type de tâches triviales, utilisez Shell Globbing, Regex est un peu trop pour ceux-ci, et n'analysez pas non plus ls; vous pouvez simplement faire:

ls [^[:digit:]]*
ls [![:digit:]]*

Notez que bash prend en charge à la fois ^ et ! en tant que jeton de négation de modèle dans la classe de caractères lors de la suppression.

Si vous ne voulez pas dépendre de vous locale:

ls [^[0-9]]*
ls [![0-9]]*
5
heemayl