Ich versuche, eine Variable mithilfe der Parametererweiterung $ {VAR // search / replace} zu suchen und zu ersetzen. Ich habe eine ziemlich lange und böse PS1, deren Größe ich nach der Erweiterung herausfinden möchte. Dazu muss ich eine Reihe von Escape-Sequenzen entfernen, die ich hineingesteckt habe. Beim Versuch, alle ANSI CSI SGR-Sequenzen zu entfernen, bin ich jedoch auf ein Problem mit meiner Syntax gestoßen.
Angesichts meiner PS1 von:
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$
(Ja, es ist krank, ich weiß ...)
Ich versuche zu tun:
# readability
search='\\\[\\033\[[0-9]*m\\\]'
# do the magic
sane="${PS1//$search/}"
Diese scheinen jedoch an der Stelle gierig zu sein [0-9]
(fast so, als würde [0-9]
man sie .
stattdessen behandeln ):
echo "${PS1//$search/}"
\[\033]0;[\h] \w\007\]\n$
Wenn ich das entferne *
und [0-9]
zu [0-9][0-9]
(wie dies veranschaulichender ist) wechsle , komme ich dem erwarteten Ergebnis näher:
$ 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$
Warum macht die *
(null oder mehr) verrückte Dinge? vermisse ich hier etwas Wenn ich den gleichen regulären Ausdruck durch sed gebe, erhalte ich das erwartete Ergebnis:
echo $PS1 | sed "s/$search//g"
\[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$
quelle
extglob
beeinflusst das Mustervergleichsverhalten.*([0-9])
ist das Äquivalent zur[0-9]*
Verwendungextglob
.Antworten:
Klingt für mich so, als ob Sie Dinge zwischen
\[
und entfernen möchten\]
:Allerdings
bash
ist die Substitution so ineffizient , dass Sie wahrscheinlich besser wären aus dem Brennenperl
odersed
hier, oder es in einer Schleife tun:(Das ist die Standard-POSIX-Sh-Syntax oben, übrigens).
Und wenn Sie die erweiterte Eingabeaufforderung daraus möchten :
quelle
[
und zu entfernen]
. Vielen Dank!Nach einigen Anleitungen von jordanm (und dem Lesen des Abschnitts "Pattern Matching" auf der Bash-Manpage) stellt sich heraus, dass diese von der Parametererweiterung verwendeten Muster keine regulären Ausdrücke sind. Jedoch für meinen speziellen Fall, wenn
shopt extglob
kann ich jedoch Folgendes tun:wo
*([0-9])
ist das gleiche wie[0-9]*
in Regex.Es scheint, dass extglob einige Mechanismen bietet, die Regex ähneln (von der Bash-Manpage):
quelle
extglob
implementiert eine Teilmengeksh
erweiterter Globs.ksh93
hat tatsächlich einen printf-Operator zum Konvertieren zwischen Mustern und (AT & T) REs (printf '%P\n' '\\\[[0-9]*\\\]'
gibt*\\\[*([0-9])\\\]*
)Pure Bash unterstützt alle ANSI-Sequenzen
quelle