终端 ANSI 转义字符的各种玩法

终端 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
# Bash 中直接输出彩色文本
echo -e "\033[31m红色文字\033[0m"

# Python 中使用 ANSI 转义序列
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
# 256 色(索引 202,橙色)
echo -e "\033[38;5;202m橙色文字\033[0m"

# 真彩色(RGB: 255, 100, 50)
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"
# 或者使用 \a 代替 \007
echo -e "\033]0;我的终端标题\a"
1
print("\033]0;我的终端标题\007")

实际使用示例

彩色输出(Bash/Python)

1
2
3
4
5
# Bash 中直接输出彩色文本
echo -e "\033[31m红色文字\033[0m"

# Python 中使用 ANSI 转义序列
print("\033[32m绿色文字\033[0m")

动态进度条

效果:动态增长的 [##########>100] 0% 样式

1
2
3
4
5
6
7
8
9
# 使用 ANSI 转义序列实现动态进度条
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
# 移动光标到第 5 行第 10 列
echo -e "\033[5;10fHello, World!"

终端 ANSI 转义字符的各种玩法
https://taylorandtony.github.io/2025/06/23/other-终端-ANSI-转义字符的各种玩法/
作者
TaylorAndTony
发布于
2025年6月23日
许可协议