Bash : Pattern Matching

De Justine's wiki
Aller à la navigation Aller à la recherche

Issu de : https://www.linuxjournal.com/content/pattern-matching-bash  

Ressources :

https://www.tldp.org/LDP/abs/html/globbingref.html

Globbing

Il s'agit ici de "globbing", c'est-à-dire, l'expansion des fonctionnalités des wildcards (* et ?). Il ne s'agit donc pas ici d'expression régulières, bien que celles-ci puissent être utilisées conjointement avec du globbing.   Les patterns de glob de Bash sont les suivants :

Pattern Description
* Match zero or more characters
? Match any single character
[...] Match any of the characters in a set
?(patterns) Match zero or one occurrences of the patterns (extglob)
*(patterns) Match zero or more occurrences of the patterns (extglob)
+(patterns) Match one or more occurrences of the patterns (extglob)
@(patterns) Match one occurrence of the patterns (extglob)
!(patterns) Match anything that doesn't match one of the patterns (extglob)

  Exemples :

$ ls
a.jpg  b.gif  c.png  d.pdf ee.pdf

$ ls *.jpg
a.jpg

$ ls ?.pdf
d.pdf

$ ls [ab]*
a.jpg  b.gif

$ shopt -s extglob   # turn on extended globbing

$ ls ?(*.jpg|*.gif)
a.jpg  b.gif

$ ls !(*.jpg|*.gif)  # not a jpg or a gif
c.png d.pdf ee.pdf
<span class="gp">$</span> ls *.pdf
<span class="go">ee.pdf  e.pdf  .pdf</span>

<span class="gp">$</span> ls ?<span class="o">(</span>e<span class="o">)</span>.pdf    <span class="c1"># zero or one "e" allowed</span>
<span class="go">e.pdf  .pdf</span>

<span class="gp">$</span> ls *<span class="o">(</span>e<span class="o">)</span>.pdf    <span class="c1"># zero or more "e"s allowed</span>
<span class="go">ee.pdf  e.pdf  .pdf</span>

<span class="gp">$</span> ls +<span class="o">(</span>e<span class="o">)</span>.pdf    <span class="c1"># one or more "e"s allowed</span>
<span class="go">ee.pdf  e.pdf</span>

<span class="gp">$</span> ls @<span class="o">(</span>e<span class="o">)</span>.pdf    <span class="c1"># only one e allowed</span>
<span class="go">e.pdf</span>

Les glob sont juste une autre façon de trouver des patterns spécifique en bash, et on peut les utiliser un peu partout; après un ==, dans un case, etc.

$ shopt +s extglob

$ a=something
$ if [[ $a == +(some|any)thing ]]; then echo yes; else echo no; fi
yes

$ a=anything
$ if [[ $a == +(some|any)thing ]]; then echo yes; else echo no; fi
yes

$ a=nothing
$ if [[ $a == +(some|any)thing ]]; then echo yes; else echo no; fi
no