有什么办法可以清除终端中的特定行数?

有什么办法可以清除终端中的特定行数?

以下是用例:

  1. 脚本node.js清除控制台。
  2. 然后它将一些元数据发送到控制台。(模块名称, 和标语。有点像应用程序的标题。)

  3. 它将过去的数据发送到控制台。(有点像应用程序的初始内容,由于它是过去的,因此在发布后不会改变。至少,直到退出时不会改变。)

  4. 它按照模块的用途执行其应执行的操作,并将其传输到控制台。

第 4 步是一个连续的过程。因此,你可以将第 4 步想象成一个. 每一秒之后,时钟都会重置并显示新的时间。

\033c如果没有步骤 1-3,那么就可以正常工作。但是,它们确实存在,我能想到的唯一方法是再次打印所有数据。

虽然可以工作,但这不是性能最好的代码。那么,我有什么办法可以清除步骤 4 的输出,然后重新打印更改后的输出吗?

笔记:终端的最后一行不一定是程序的最后一行。

答案1

如果没有步骤 1-3,\033c 就可以正常工作。

\033是 ASCIIEscape控制代码字符。我相信Escape c这是用于重置终端的 ANSI 终端命令序列。

您可以发出CR(回车)将光标移动到左边距,然后发出Escape [ K(清除到行尾)。

如果步骤 4 的输出有多行,则需要发出适当的命令将光标移动到行、列并清除到屏幕末尾。

搜索“ANSI 终端控制代码”应该可以找到有用的参考资料。

我需要...某种 bash 命令

man tput

考虑

$ echo aaa bbb ccc `tput cr`xxx
xxx bbb ccc

$ echo aaa bbb ccc `tput cr`xxx `tput el`
xxx

或者

$ echo aaa bbb ccc; echo ddd eee fff
aaa bbb ccc
ddd eee fff

$ echo aaa bbb ccc; echo ddd eee fff; echo `tput cup 23 3` ZZZ
aaa bbb ccc
ddd ZZZ fff

或者

$ echo aaa bbb ccc; echo ddd eee fff; echo `tput cup 22 3` ZZZ `tput ed`
aaa ZZZ

其中使用的功能代码为

  • cr= 回车(光标移到左边距)。
  • el= 清除从光标到行尾的内容。
  • cup= 光标定位。
  • ed= 清除从光标到屏幕末尾的内容。

这些能力代码列在 中man terminfo

如果你想知道 tput 正在做什么,你可以这样做

$ (tput cup 23 3; echo) | cat -v
^[[24;4H

其中^[代表控制代码Escape(\033)。

这将为你提供你可以以任何你打算使用的方式使用的值\033c

相关内容