如何在控制台应用程序(Linux)中擦除打印的字符?

时间:2009-01-10 07:42:01

标签: linux console character erase

我正在创建一个需要进度条的小型控制台应用。有点像...

Conversion: 175/348 Seconds   |==========          |  50%

我的问题是,如何删除已经打印到控制台的字符?当我达到第51个百分比时,我必须从控制台擦除这一行并插入一个新行。在我目前的解决方案中,这就是发生的事情......

Conversion: 175/348 Seconds   |==========          |  50%
Conversion: 179/348 Seconds   |==========          |  52%
Conversion: 183/348 Seconds   |==========          |  54%
Conversion: 187/348 Seconds   |===========         |  56%

我使用的代码是......

print "Conversion: $converted_seconds/$total_time Seconds   $progress_bar  $converted_percentage%\n";

我在Linux中使用PHP进行此操作(只有我会使用该应用程序 - 所以请原谅语言选择)。因此,该解决方案应该适用于Linux平台 - 但如果您的解决方案是跨平台的,那么这将是更可取的。

6 个答案:

答案 0 :(得分:18)

我认为你不需要为语言选择道歉。 PHP是控制台应用程序的一种很好的语言。

试试这个:

<?php
for( $i=0;$i<10;$i++){
  print "$i \r";
  sleep(1);
}
?>

“\ r”将使用新文本覆盖该行。要创建一个新行,你可以使用“\ n”,但我猜你已经知道了。

希望这有帮助!我知道这适用于Linux,但我不知道它是否适用于Windows或其他操作系统。

答案 1 :(得分:9)

要删除以前打印的字符,您有三个选项:

  • echo chr(8) . " ";回显后面的字符,并将光标向后移动一个位置,然后空格覆盖该字符。您可以连续多次使用chr(8)来移回多个字符。

  • echo "\r";会将光标返回到当前行的开头。您现在可以用新文本替换该行。

  • 第三个选项是使用ANSI转义码设置光标位置的行和列,然后打印替换字符。它可能不适用于所有终端:

  function movecursor($line, $column){
      echo "\033[{$line};{$column}H";
  }

答案 2 :(得分:8)

\ r做了这个伎俩。

为了将来参考,\ b在Linux中的PHP中不起作用。我很好奇 - 所以我也用其他语言进行了几次实验(我在Linux中做了这个 - 我不知道Windows / Mac中的结果是否相同)..

\ b适用于......

  • 的Perl
  • 红宝石
  • Tcl - 代码为puts -nonewline "Hello\b"

\ b无效

  • PHP - 代码print "Hello\b";打印出Hello\b
  • Python - 代码print "Hello\b"打印出Hello<new line>。与print "Hello\b",
  • 的结果相同

答案 3 :(得分:4)

我不确定它在Linux中是否相同但在Windows控制台应用程序中您可以打印\ r \ n并且光标将返回到该行的左侧第一个位置,允许您覆盖右侧的所有字符。

您可以使用\ b移回单个字符,但由于您要更新进度条\ r \ n比使用打印\ b x次更简单。

答案 4 :(得分:2)

这似乎是一个非常古老的话题,但我会把我的5放进去。

for ($i; $i<_POSITION_; $i--) {
   echo "\010"; //issue backspace 
}

前一段时间在互联网上发现这个,遗憾的是不记得在哪里。因此,所有学分都归原作者所有。

答案 5 :(得分:0)

要删除以前打印过的字符,请在其后打印退格: 打印“a” 打印“\ b”

将打印 nothing (实际上它会打印然后退格,但你可能不会注意到它)