我可以使用 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我完全理...

问题描述:

例如:我开始用 录音script,并尝试输入echo test但省略了 o,因此我按退格键来更正它。

当我cat typescript一切看起来正常时,因为代码被解释,但如果我使用lessvim我看到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//; 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 脚本。


  1. 
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用