web-dev-qa-db-fra.com

Quel est le caractère générique spécifiant un ou deux caractères?

Existe-t-il un moyen plus simple d'écrire: wc -l foo?.txt foo??.txt?

Comme dans mon cas, j'ai (au plus) deux chiffres, j'ai essayé d'utiliser la spécification de plage wc -l foo[1-99].txt mais elle n'a finalement affiché que les résultats compris entre 1 et 9 (au lieu de 99). Mais il s’agit d’un hack (non fonctionnel), et j’ai vraiment besoin de quelque chose comme wc -l foo[?,??].txt.

7
Matsmath

Lorsque vous avez deux choix ou plus, utilisez extension d'accolade:

foo{?,??}.txt

Ou, pour être plus précis:

foo{[0-9],[0-9][0-9]}.txt

Exemple

Considérons un répertoire avec ces trois fichiers:

$ ls foo*txt
foo111.txt  foo11.txt  foo1.txt

Observer:

$ echo foo{?,??}.txt
foo1.txt foo11.txt

Et:

$ echo foo{[0-9],[0-9][0-9]}.txt
foo1.txt foo11.txt

Ou, plus concement:

$ echo foo{,[0-9]}[0-9].txt
foo1.txt foo111.txt
6
John1024

Avec la syntaxe extended glob (extglob) de bash, vous pouvez utiliser foo@(?|??) par exemple.

wc -l foo@(?|??).txt

L’option extglob doit être activée par défaut dans le shell interactif des versions actuelles d’Ubuntu. Sinon, vous pouvez l’activer à l’aide de

shopt -s extglob
4
steeldriver