我正在尝试使用$ {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$
混蛋,这就是为什么-我直觉可能是这样:/我试图找到匹配机制的说明,但没有成功。前往阅读有关extglob的信息(看起来像sed的工作!)
—
Drav Sloan
*([0-9])
等于[0-9]*
使用extglob
。
如果您得到正确的答案,可以回答您自己的问题。我很高兴提供一些指导。
—
jordanm
@DravSloan-此提示令人不适!8
—
slm
extglob
确实会影响模式匹配行为。