J'essaie de faire de la recherche et du remplacement sur une variable en utilisant l'expansion du paramètre $ {VAR // search / replace}. J'ai une PS1 assez longue et maléfique, dont je veux déterminer la taille après l'extension. Pour ce faire, je dois supprimer un tas de séquences d'échappement que je fourre dedans. Cependant, en essayant de supprimer toutes les séquences ANSI CSI SGR, je suis tombé sur un problème avec ma syntaxe.
Compte tenu de ma PS1 de:
PS1=\[\033]0;[\h] \w\007\]\[\033[1m\]\[\033[37m\](\[\033[m\]\[\033[35m\]\u@\[\033[m
\]\[\033[32m\]\h\[\033[1m\]\[\033[37m\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m
\]\t\[\033[37m\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m\]\[\033[36m\]\w\[\033[1m
\]\[\033[37m\])\[\033[35m\]${git_branch}\[\033[m\]\n$
(oui c'est malade je sais ...)
J'essaye de faire:
# readability
search='\\\[\\033\[[0-9]*m\\\]'
# do the magic
sane="${PS1//$search/}"
Cependant ceux-ci semblent être gourmands au point de [0-9]
(presque comme [0-9]
est traité comme un à la .
place):
echo "${PS1//$search/}"
\[\033]0;[\h] \w\007\]\n$
Si je retire le *
, et le changement [0-9]
à [0-9][0-9]
(comme cela est plus illustrative) Je me rapproche du résultat attendu:
$ search='\\\[\\033\[[0-9][0-9]m\\\]'
$ echo "${PS1//$search/}"
\[\033]0;[\h] \w\007\]\[\033[1m\](\[\033[m\]\u@\[\033[m\]\h\[\033[1m
\]\[\033[1m\])\[\033[m\]-\[\033[1m\](\[\033[m\]\t\[\033[1m\])\[\033[m\]-\[\033[1m
\](\[\033[m\]\w\[\033[1m\])$(git_branch)\[\033[m\]\n$
Pourquoi le *
(zéro ou plus) fait des choses folles? Est-ce que j'ai râté quelque chose? Si je passe le même regex à travers sed, j'obtiens le résultat attendu:
echo $PS1 | sed "s/$search//g"
\[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$
*([0-9])
est l'équivalent de l' [0-9]*
utilisation extglob
.
extglob
affecte le comportement de correspondance de modèle.