我在 BASH shell 中遇到了变量替换的问题。
假设您定义了一个变量a。然后命令
$> echo ${a//[0-4]/}
Run Code Online (Sandbox Code Playgroud)
打印其值,并删除所有介于 0 和 4 之间的数字:
$> a="Hello1265-3World"
$> echo ${a//[0-4]/}
Hello65-World
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好,但让我们看看下一个例子:
$> b="?1265-3?"
$> echo ${b//[0-4]/}
?1265-3?
Run Code Online (Sandbox Code Playgroud)
没有发生替换:我认为这是因为b包含 CJK 字符。这个问题扩展到所有涉及方括号的情况。令人惊讶的是,没有方括号的变量替换在两种情况下都可以正常工作:
$> a="Hello1265-3World"
$> echo ${a//2/}
Hello165-3World
$> b="?1265-3?"
$> echo ${b//2/}
?165-3?
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我错过了什么?
我使用 Lubuntu 12.04,终端是lxterminal并echo $BASH_VERSION返回 4.2.24(1)-release。
编辑: 安德鲁约翰逊在他的评论中表示,使用gnome-terminal4.2.37(1)-release 命令可以正常工作。我想知道这是否是lxterminal其特定的 4.2.24(1)-release 版本的问题。
编辑:我gnome-terminal在 Lubuntu 12.04 上尝试过,但问题仍然存在......
我知道这会tput sc保存当前的光标位置并tput rc准确地将其恢复到tput sc被调用的位置。问题是每次tput sc调用时,它都会覆盖之前保存的位置。
有没有一种方法,以节省更多的位置,例如tput sc pos1并且tput sc pos2可与,比如说可以恢复,tput rc pos1并tput rc pos2分别?(解决方案不需要使用tput,我提到它是因为它是我知道的唯一处理光标位置的命令)
如果没有,有没有办法至少在函数中本地保存光标位置,以便如果一个函数使用tput sc然后调用另一个再次运行的函数tput sc,那么每个函数在调用时都会恢复自己保存的光标位置tput rc?
提前致谢。