Как стереть напечатанные символы в консольном приложении (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, но если у вас есть кроссплатформенное решение, это будет предпочтительнее.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
0
12 802
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

Ответ принят как подходящий

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

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

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

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

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

Кроме того, это сбивает с толку многие «глупые» терминалы (или эмуляторы терминалов, или режимы буфера мертвых кадров), равно как и различные клиенты SSH. Буквальный пробел \ b - самый безопасный способ.

Tim Post 10.01.2009 11:03

Я совершенно забываю, что вы могли сделать это на оболочке.

David 10.01.2009 11:22

Ух ты! Я собираюсь попробовать это. Добавлю цвета, чтобы посмотреть, работает ли

Viet 15.11.2012 04:59

@GnomeCubed PHP никогда не должен использоваться.

Nick Sotiros 07.04.2018 05:56

\ r сделал свое дело.

Для справки в будущем \ b не работает в PHP в Linux. Мне было любопытно - поэтому я провел пару экспериментов и на других языках (я делал это в 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",

python print добавляет \ n автоматически. используйте sys.stdout.wirte вместо print, если хотите оставаться в той же строке

Matus 09.04.2011 16:48

Конечно, символ возврата все еще существует! Он просто недоступен в строковых литералах с escape-символом. Попробуйте chr(8).

Luna 15.11.2012 12:21

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

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

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

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

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

Это кажется довольно старой темой, но я расскажу о своей пятерке.

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

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

Другие вопросы по теме