我可以使用 unix 实用程序以编程方式将 ANSI 控制代码“刻录”到文件中吗?
- 2024-10-21 09:14:00
- admin 原创
- 73
问题描述:
例如:我开始用 录音script
,并尝试输入echo test
但省略了 o,因此我按退格键来更正它。
当我cat typescript
一切看起来正常时,因为代码被解释,但如果我使用less
或vim
我看到ech test^H^[[K^H^[[K^H^[[K^H^[[K^H^[[Ko test^M
我完全理解这是什么以及为什么会发生这种情况,但是有没有办法“刻录”代码并在文件中查看结果?我的笨拙方法是将文本复制到cat
文件中,然后从终端中复制/粘贴文本,但是 cat、sed、awk 或其他程序的组合肯定可以让我更轻松地实现这一点?
解决方案 1:
要显示包含 ANSI 序列的文件,
less -r typescript
或者,
less -R typescript
要从文件中删除 ANSI 和退格序列,创建一个干净的newfile
,请尝试:
sed -r ':again; s/[^x08]x08x1b[K//; t again; s/x1b_[^x1b]*x1b[]//g; s/x1B[[^m]*m//g' typescript >newfile
工作原理
-r
这将启用扩展正则表达式。(在 BSD 系统上,-r
应替换为-E
。GNU sed 的现代版本将接受-r
或-E
。)
`:again; s/1[K//; t 再次
这将删除所有退格序列。这些操作在循环中一次完成一个。
s/x1b_[^x1b]*x1b[]//g
作为xterm
扩展(参见文档),Esc _ something Esc
不会执行任何操作。此命令将删除这些序列。
s/x1B[[^m]*m//g
这将删除设置颜色等的剩余 ANSI 序列。
这涵盖了我通常遇到的所有控制序列。有各种各样的扩展控制序列,如果您的输出中有一些我没见过的,则代码可能需要扩展。
POSIX 或 BSDsed
在 BSD 或 POSIX 系统上,各个命令必须用-e
选项而不是分号链接在一起。因此,尝试:
sed -e ':again' -e 's/[^x08]x08x1b[K//' -e 't again' -e 's/x1b_[^x1b]*x1b[]//g' -e 's/x1B[[^m]*m//g'
解决方案 2:
建议使用“sed -r”的答案依赖于 GNU sed,这使得它实际上不可移植。可以使用 POSIX sed 实现相同的功能,但不同:POSIX 不提供在命令选项中传递整个脚本的功能,如下所示。这意味着实现循环的 (POSIX) 方式将放在单独的文件中,使用“-f”选项传递给 sed。同样,十六进制常量不可移植。进行这些更改后,可以在 BSD 和 Unix 系统上使用功能等效的脚本。
建议的答案也没有涵盖一些相当常见的回车符用法(例如在 yum 输出中),也没有过滤掉“大多数”ANSI 序列(因为它专注于 SGR“m”最后一个字符)。最后,它提到
escape _ text _
作为 xterm 扩展。但是 xterm 不提供这样的扩展,因为两个字符“escape”和“_”开始应用程序命令序列(而 xterm 没有实现任何命令)。
生成的 sed 脚本如下所示(“^[”是转义字符):
s/^[[[][<=>?]{0,1}[;0-9]*[@-~]//g
s/^[[]][^^[]*^G//g
s/^[[]][^^[]*^[\\//g
:loop
s/[^^H]^H(.)//g
t loop
s/^M^M*$//g
s/^.*^M//g
s/^[[^[]//g
可以在此处找到更完整的脚本“script2log” 。但是,有些东西(例如 CSI K)不适合 sed 脚本。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件