Bash, pattern substitution

2012-08-08

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
$ for b in configb configb1 configb2 configb_test; 
do 
  echo $b $(DB_NAME=$b; echo '%%configcommon' | sed -e "s/%%configcommon/${DB_NAME/configb@(1|2|)/configcommon}/g" )
done
configb configcommon
configb1 configcommon
configb2 configcommon
configb_test configcommon_test