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.
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]]*