Как переписать напечатанную строку в оболочке с помощью Ruby? - PullRequest
40 голосов
/ 11 февраля 2011

Как бы я переписал ранее напечатанную строку в оболочке Unix с помощью Ruby?

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

Ответы [ 3 ]

64 голосов
/ 11 февраля 2011

Вы можете использовать escape-последовательность \r в конце строки (следующая строка перезапишет эту строку).Следуя вашему примеру:

require 'time'

loop do
  time = Time.now.to_s + "\r"
  print time
  $stdout.flush
  sleep 1
end
31 голосов
/ 11 февраля 2011

Используйте escape-последовательность \r в конце строки - это возврат каретки без перевода строки .

На большинстве терминалов Unix это будет делать то, что вы хотите: следующая строка будет перезаписывать предыдущую строку.

Возможно, вы захотите дополнить конец строк пробелами, если они короче предыдущих строк.

Обратите внимание, что это не относится к Ruby. Этот трюк работает на любом языке!

1 голос
/ 27 июля 2015

Вот пример, который я только что написал, который принимает массив и выводит пробелы, если это необходимо.Вы можете раскомментировать переменную скорости, чтобы контролировать скорость во время выполнения.Также удалите другой сон 0.2 Последняя часть в массиве должна быть пустой, чтобы вывести весь массив, все еще работая над его исправлением.

#@speed = ARGV[0]

strArray = [ "First String there are also things here to backspace", "Second Stringhereare other things too ahdafadsf", "Third String", "Forth String", "Fifth String", "Sixth String", " " ]


#array = [ "/", "-", "|", "|", "-", "\\", " "]

def makeNewLine(array)
    diff = nil
    print array[0], "\r"
    for i in (1..array.count - 1)
        #sleep @speed.to_f
        sleep 0.2
        if array[i].length < array[i - 1].length
             diff = array[i - 1].length - array[i].length
        end
        print array[i]
        diff.times { print " " } if !diff.nil?
        print "\r"
        $stdout.flush

    end
end

20.times { makeNewLine(strArray) }

#20.times { makeNewLine(array)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...