终端 ANSI 转义字符的各种玩法
ANSI转义序列(ANSI Escape Sequences)是一系列以 ESC(ASCII 码 27
,即 \033
或 \x1B
) 开头的控制字符序列,用于在终端或控制台中控制文本的显示格式、颜色、光标位置等。它们最初由 ANSI(美国国家标准协会)制定,成为终端控制的通用标准,广泛应用于 Unix/Linux 终端、Windows 的现代终端(如 PowerShell、Windows Terminal)以及编程语言的输出中。
ANSI 转义序列可以控制以下内容:
1. 文本样式:加粗、斜体、下划线、闪烁等。
1. 文本颜色:前景色(文字颜色)和背景色。
1. 光标控制:移动光标、隐藏/显示光标、保存/恢复光标位置。
1. 清屏操作:清除屏幕或行。
1. 终端模式:切换键盘输入模式等。
Basics
所有 ANSI 转义序列以 ESC[
(即 \033[
或 \x1B[
)开头,后跟参数,最后以字母(称为“终止符”)结束。例如:
1 2
| ESC[31m # 设置文本颜色为红色(31 是红色代码) ESC[0m # 重置所有样式(0 是重置代码)
|
1 2 3 4 5
| echo -e "\033[31m红色文字\033[0m"
print("\033[32m绿色文字\033[0m")
|

颜色
代码 |
功能 |
示例 |
30 |
黑色前景 |
\033[30m |
31 |
红色前景 |
\033[31m |
32 |
绿色前景 |
\033[32m |
33 |
黄色前景 |
\033[33m |
34 |
蓝色前景 |
\033[34m |
35 |
洋红前景 |
\033[35m |
36 |
青色前景 |
\033[36m |
37 |
白色前景 |
\033[37m |
40 |
黑色背景 |
\033[40m |
41 |
红色背景 |
\033[41m |
… |
… |
… |
47 |
白色背景 |
\033[47m |
代码 |
功能 |
示例 |
0 |
重置所有样式 |
\033[0m |
1 |
加粗/高亮 |
\033[1m |
2 |
变暗(弱化) |
\033[2m |
3 |
斜体 |
\033[3m |
4 |
下划线 |
\033[4m |
5 |
闪烁 |
\033[5m |
7 |
反色(前景/背景互换) |
\033[7m |
8 |
隐藏文本 |
\033[8m |
1 2
| print('\033[1;31;40mHello World\033[0m')
|
1 2 3 4 5
| echo -e "\033[38;5;202m橙色文字\033[0m"
echo -e "\033[38;2;255;100;50m自定义 RGB 颜色\033[0m"
|

光标控制
序列 |
功能 |
示例 |
ESC[<n>A |
光标上移 n 行 |
\033[2A |
ESC[<n>B |
光标下移 n 行 |
\033[3B |
ESC[<n>C |
光标右移 n 列 |
\033[5C |
ESC[<n>D |
光标左移 n 列 |
\033[4D |
ESC[<H>;<L>f |
移动光标到 (H,L) |
\033[10;20f |
ESC[<n>s |
保存光标位置 |
\033[2s |
ESC[<n>u |
恢复光标位置 |
\033[2u |
ESC[?25l |
隐藏光标 |
\033[?25l |
ESC[?25h |
显示光标 |
\033[?25h |
清屏
序列 |
功能 |
示例 |
ESC[2J |
清除整个屏幕 |
\033[2J |
ESC[1J |
清除从光标到屏幕开头 |
\033[1J |
ESC[0J |
清除从光标到屏幕末尾 |
\033[0J |
ESC[K |
清除当前行 |
\033[K |
ESC[1K |
清除从光标到行首 |
\033[1K |
ESC[2K |
清除整行 |
\033[2K |
设置标题
使用 ESC]0;<title>BEL
设置标题。
title
: 标题
ESC
: 0x1B
, or \033
BEL
: 0x07
, or \a
1 2 3
| echo -e "\033]0;我的终端标题\007"
echo -e "\033]0;我的终端标题\a"
|
1
| print("\033]0;我的终端标题\007")
|
实际使用示例
彩色输出(Bash/Python)
1 2 3 4 5
| echo -e "\033[31m红色文字\033[0m"
print("\033[32m绿色文字\033[0m")
|
动态进度条
效果:动态增长的 [##########>100] 0%
样式
1 2 3 4 5 6 7 8 9
| for i in {1..10}; do printf "\r[\033[32m%s\033[0m>%s] %d%%" \ $(printf "%${i}s" | tr ' ' '#') \ $(printf "%$((10-i))s" | tr ' ' ' ') \ $((i*10)) sleep 0.1 done echo
|
光标移动
1 2
| echo -e "\033[5;10fHello, World!"
|