mercredi 8 août 2012

Bash, pattern substitution

Le manuel bash présente les syntaxes suivantes (voir)
  • ${parameter#word} et ${parameter##word} pour supprimer le plus court et le plus long préfix
  • ${parameter%word} et ${parameter%%word} pour supprimer le plus court et le plus long suffixe
  • ${parameter/pattern/string} pour substituer une chaîne à un pattern.
Il faut savoir que word peut être une regexp dans les 2 premiers cas. Mais il faut surtout savoir que la syntaxe du pattern diffère de celles que l'on connaît généralement... Sur wiki.bash-hackers.org :
?(<PATTERN-LIST>) Matches zero or one occurrence of the given patterns
*(<PATTERN-LIST>) Matches zero or more occurrences of the given patterns
+(<PATTERN-LIST>) Matches one or more occurrences of the given patterns
@(<PATTERN-LIST>) Matches one of the given patterns
!(<PATTERN-LIST>) Matches anything except one of the given patterns
D'où des choses zarbies du genre :
$ shopt -s extglob
$ v="LE temps PASSE vite"
$ echo ${v//+([[:upper:]])} 
temps vite
$ echo ${v%%+([[:lower:]])} 
LE temps PASSE
pattern