Estoy tratando de buscar y reemplazar una variable usando la expansión del parámetro $ {VAR // buscar / reemplazar}. Tengo una PS1 bastante larga y malvada, que quiero calcular el tamaño de después de la expansión. Para hacerlo, tengo que eliminar un montón de secuencias de escape. Sin embargo, al tratar de eliminar todas las secuencias ANSI CSI SGR, me encontré con un problema con mi sintaxis.
Dada mi 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$
(sí, está enfermo, lo sé ...)
Estoy tratando de hacer:
# readability
search='\\\[\\033\[[0-9]*m\\\]'
# do the magic
sane="${PS1//$search/}"
Sin embargo, estos parecen ser codiciosos en el punto de [0-9]
(casi como si [0-9]
se tratara como un .
lugar):
echo "${PS1//$search/}"
\[\033]0;[\h] \w\007\]\n$
Si elimino el *
, y cambio [0-9]
a [0-9][0-9]
(ya que es más ilustrativo) me acerco al resultado esperado:
$ 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$
¿Por qué el *
(cero o más) está haciendo locuras? ¿Me estoy perdiendo de algo? Si paso la misma expresión regular a través de sed, obtengo el resultado esperado:
echo $PS1 | sed "s/$search//g"
\[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$
*([0-9])
es el equivalente de [0-9]*
usar extglob
.
extglob
afecta el comportamiento de coincidencia de patrones.