bash manual说,在提示符下,任何非打印字符序列都应括起来,例如:\[this\]
:
\[ Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\] End a sequence of non-printing characters.
给出提示中要包含的字符串,我如何自动转义所有ANSI控制/颜色代码,以使提示在所有情况下都能正确显示/换行?
区别:在这里,我假设已经产生了带有ANSI控制代码的字符串。
This related question假定可以通过编辑字符串的生成函数来插入定界符。
答案 0 :(得分:0)
以下内容将ANSI控制序列括在ASCII SOH
(^A
)和STX
(^B
)which are equivalent to \[
and \]
respectively中:
function readline_ANSI_escape() {
if [[ $# -ge 1 ]]; then
echo "$*"
else
cat # Read string from STDIN
fi | \
perl -pe 's/(?:(?<!\x1)|(?<!\\\[))(\x1b\[[0-9;]*[mG])(?!\x2|\\\])/\x1\1\x2/g'
}
使用方式:
$ echo $'\e[0;1;31mRED' | readline_ANSI_escape
或者:
$ readline_ANSI_escape "$string"
作为奖励,多次运行该函数不会重新转义已经转义的控制代码。
答案 1 :(得分:0)
不要尝试使其自动化。
Bash要求您手动添加\[...\]
的原因是因为shell无法合理地知道任何给定的终端将如何解释任何转义码。如果是这样,那么Bash只会首先做到这一点。
例如,以下是其他答案无法处理的许多情况。在每种情况下,我的特定终端上都没有输出输出,但是转义功能无法转义它们:
printf '\e]1;Hello\a' # Set window title
printf '\e[0;2;0;0;0}' # 24-bit color
printf '\e[13]' # Unblank screen