bash $ {VAR // search / replace}和奇怪的正则表达式行为
我正在尝试使用$ {VAR // search / replace}参数扩展对变量进行搜索和替换。我有一个相当漫长而邪恶的PS1,我想算出扩展后的大小。为此,我必须删除一堆我塞进其中的转义序列。但是,在尝试删除所有ANSI CSI SGR序列时,我遇到了语法问题。 鉴于我的PS1: 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$ (是的,我知道病了...) 我正在尝试做: # readability search='\\\[\\033\[[0-9]*m\\\]' # do the magic sane="${PS1//$search/}" 但是这些似乎有点贪婪[0-9](几乎就像[0-9]被当作一个.替代): echo "${PS1//$search/}" \[\033]0;[\h] \w\007\]\n$ 如果我删除*,然后更改[0-9]为[0-9][0-9](这是更说明性的),那么我将接近预期的结果: $ 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$ 为什么*(零个或多个)做疯狂的事情?我在这里想念什么吗?如果我通过sed传递相同的正则表达式,则会得到预期的结果: echo $PS1 | sed "s/$search//g" \[\033]0;[\h] \w\007\](\u@\h)-(\t)-(\w)$(git_branch)\n$