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$
fuente
extglob
afecta el comportamiento de coincidencia de patrones.*([0-9])
es el equivalente de[0-9]*
usarextglob
.Respuestas:
Me parece que quieres eliminar cosas entre
\[
y\]
:Sin embargo, la
bash
sustitución es tan ineficiente que probablemente sería mejor dispararperl
osed
aquí, o hacerlo en un ciclo como:(esa es la sintaxis estándar POSIX sh arriba, por cierto).
Y si desea la solicitud expandida de eso:
fuente
[
y]
. ¡Gracias!Después de algunas indicaciones de jordanm (y la lectura de la sección "Coincidencia de patrones" de la página del manual de bash), resulta que estos patrones utilizados por la expansión de parámetros no son expresiones regulares. Sin embargo, para mi caso específico, si
shopt extglob
está activado, puedo hacer:donde
*([0-9])
es lo mismo que[0-9]*
en regex.Parece que extglob proporciona algunos mecanismos similares a regex con (desde bash man page):
fuente
extglob
implementa un subconjunto deksh
globos extendidos.ksh93
en realidad tiene un operador printf para convertir entre patrones y (AT&T) REs (printf '%P\n' '\\\[[0-9]*\\\]'
da*\\\[*([0-9])\\\]*
)Pure Bash gama completa de secuencias ANSI compatibles
fuente