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$
la source
extglob
affecte le comportement de correspondance de modèle.*([0-9])
est l'équivalent de l'[0-9]*
utilisationextglob
.Réponses:
Pour moi, vous voulez supprimer des choses entre
\[
et\]
:Cependant, la
bash
substitution est si inefficace que vous feriez probablement mieux de tirerperl
oused
ici, ou de le faire en boucle comme:(c'est la syntaxe standard POSIX sh ci-dessus, BTW).
Et si vous voulez l' invite développée à partir de cela:
la source
[
et]
. Merci!Après quelques conseils de jordanm (et la lecture de la section "Pattern Matching" de la page de manuel bash), il s'avère que ces modèles utilisés par l'expansion des paramètres ne sont pas des expressions rationnelles. Cependant pour mon cas spécifique, s'il
shopt extglob
est activé, je peux faire:où
*([0-9])
est le même que[0-9]*
dans regex.Il semble que extglob propose des mécanismes similaires à regex avec (à partir de la page de manuel bash):
la source
extglob
implémente un sous-ensemble deksh
globes étendus.ksh93
a en fait un opérateur printf pour convertir entre les motifs et (AT&T) REs (printf '%P\n' '\\\[[0-9]*\\\]'
donne*\\\[*([0-9])\\\]*
)Prise en charge complète de Pure Bash de séquences ANSI
la source