跳到主要内容
ansicode

EL — 行内擦除 (`\x1b[K`)

擦除当前行的部分或全部。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[NK
\\033[\033[K
\\e[\e[K
ESC [ESC [ N K
hex1b 5b <N> 4b

说明

末字节为 K。N = 0 从光标位置擦到行尾(默认 —— \x1b[K\x1b[0K 等价);N = 1 从行首擦到光标(含);N = 2 擦除整行。EL 不会移动光标 —— 如需「擦除整行 + 光标到列 1」,请先发 \r(或 \x1b[1G,CHA 列 1)再发 \x1b[2K。被擦除的格子用当前背景色填充,因此非默认 sgr-bg-* 会在擦除区域漫延 —— 这就是 /pitfalls 中记录的 color-bleed 坑。

普遍支持 —— 上面矩阵中每个模拟器(含 Linux console / fbcon 与 ConPTY)都是 yes —— 无明显可移植性问题。反复出现的坑是「光标不动」行为:新手以为 \x1b[2K 同时会把光标移到列 1,于是写入替换文本后变成把新文本拼到旧文本右侧。原地进度的规范习语是 \r\x1b[K 而非 \x1b[2K:少 1 字节,不动尚未重写的部分,并且当下一条进度消息比上一条短时也能干净处理。git 进度条、npm 输出、curl -#、busybox wget 进度行都用这个模式。背景色注意:若设置了非默认 sgr-bg-* 再 EL,被擦除区域填充该背景色;\x1b[K\x1b[49m(先擦除再重置背景)避免漫延。

EL 没有专门的「关闭」—— 它是单发擦除而非切换。重建一行的安全模式是 \r\x1b[K<新内容>\n(CR + 擦到行尾 + 写入 + LF),能承受替换更短、终端调整大小、tmux 分屏切换。多行重绘把 cursor-move(CUU 上移 N 行)与每行的 EL 组合再退回。纵向对应物是 erase-display\x1b[J)—— 擦到屏底 / 屏首 / 整屏。EL 的 terminfo cap 为 el / el1 / el2(clr_eol / clr_bol / clr_line);针对未知 $TERM 的 shell 脚本,写 tput el 比写裸转义更稳。

规范出处: ECMA-48 §8.3.41 (EL)

示例

bash
printf 'progress... \r\033[Kdone\n'
python
import sys, time\nfor i in range(3): sys.stdout.write(f'\r\x1b[K{i}'); sys.stdout.flush(); time.sleep(0.2)\nprint()
go
fmt.Print("\r\x1b[Kclear line\n")
javascript
process.stdout.write('\r\x1b[Kclear line\n')
c
printf("\r\x1b[Kclear line\n");

在哪里用到

实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。

  • bash, zsh readline每次按键前抹掉提示符残留再重绘
  • npm, pnpm, yarn progress每次重绘进度前发 EL,让新行覆盖旧行
  • git clone, git fetch progress
  • ora, cli-spinners (Node)
  • fzf incremental query redraw

常见问题

针对这条序列,开发者真正会去搜索的问题的简短回答。

\x1b[K\x1b[2K 有什么区别?
\x1b[K(同 \x1b[0K)从光标处擦到行末。\x1b[2K 不管光标位置,擦整行。\x1b[1K 从行首擦到光标。三者都不移动光标——所以典型的进度条更新是 \r\x1b[K<新内容>:回到第 1 列、擦掉尾部、再打出新内容。
为什么新一行比旧的短时,进度条右侧留下了垃圾字符?
你只写了 \r<新内容> 没擦——新内容只覆盖与自己字符数相同的列,前一行(更长)留下的尾部字符还在屏上。修法:\r\x1b[K<新内容>——EL 先把光标右侧全擦掉。

终端支持

xterm
支持
Linux console (fbcon)
支持
macOS Terminal.app
支持
iTerm2
支持
Windows Terminal
支持
cmd.exe / ConPTY
支持
kitty
支持
alacritty
支持
WezTerm
支持
Ghostty
支持
GNOME Terminal
支持
Konsole
支持
tmux
支持
GNU screen
支持

相关序列

在家族食谱中

CSI 食谱 · 3. 擦除 —— ED `J` 与 EL `K`