Как удалить печатные символы в консольном приложении (Linux)?

Я создаю небольшое консольное приложение, которому нужен индикатор выполнения. Что-то вроде того...

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 ответов


Я не думаю, что вам нужно извиняться за выбор языка. PHP-отличный язык для консольных приложений.

попробуйте это:

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

"\r " будет над правой строкой с новым текстом. Чтобы сделать новую строку, вы можете просто использовать "\n", но я предполагаю, что вы уже это знали.

надеюсь, что это помогает! Я знаю, что это работает в Linux, но я не знаю, работает ли это в Windows или других операционных системах.


чтобы стереть ранее напечатанный символ, у вас есть три варианта:

  • echo chr(8) . " "; повторяет символ назад и перемещает курсор на одно место, а затем пространство перезаписывает символ. Вы можете использовать chr(8) несколько раз подряд, чтобы переместить несколько символов назад.

  • echo "\r"; возвращает курсор в начало текущей строки. Теперь можно заменить строку новым текстом.

  • третий опция-установить строку и столбец позиции курсора с помощью escape-кодов ANSI, а затем распечатать символы замены. Это может не работать со всеми терминалами:

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

\r сделал трюк.

для дальнейшего использования, \b не работает в PHP в Linux. Мне было любопытно - поэтому я сделал несколько экспериментов на других языках(я сделал это в Linux - я не знаю, будет ли результат таким же в Windows/Mac)..

\b работает...

  • Perl
  • Рубин
  • Tcl-с кодом puts -nonewline "Hello\b"

\b не работает в

  • PHP-код print "Hello\b"; печать вон!--2-->
  • Python-code print "Hello\b" выводит Hello<new line> . Тот же результат с print "Hello\b",

Я не уверен, что это то же самое в Linux, но в консольных приложениях Windows вы можете распечатать \r, и курсор вернется в первое левое положение строки, позволяющее перезаписать все символы справа.

вы можете использовать \b для перемещения назад одного символа, но так как вы собираетесь обновлять индикатор выполнения \r будет проще использовать, чем печатать \b x количество раз.


это кажется довольно старой темой, но я брошу свой 5.

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

нашел в интернете некоторое время назад, к сожалению не помню, где. Так что все кредиты идут оригинальному автору.


чтобы стереть ранее напечатанный символ, я печатаю backspace после него: печать "" печать "\b"

печати ничего (на самом деле он будет печатать, а затем backspace, но вы, вероятно, не заметите его)