Как перезаписать несколько строк в сценарии оболочки?

Я хочу снова и снова писать несколько строк в терминал. Что-то типа

echo "One Line"
echo "Two Lines"
echo "\r\b\rThree Lines"
echo "Four Lines"

В идеале это должно сначала вывести:

One Line
Two Lines

И этот вывод затем будет заменен на

Three Lines
Four Lines

Проблема в том, что хотя возврат каретки позволит вам перезаписать одну строку вывода, вы не сможете обойти \n с помощью \b. Как мне перезаписать несколько строк?


person jrbalsano    schedule 25.05.2013    source источник


Ответы (1)


Я нашел решение для этого, которое немного покопалось, и я до сих пор не совсем уверен, как это работает. Однако, кажется, программа tput позволит вам получить специальные символы для очистки строк и позиционирования курсора. В частности, tput el очистит начало текущей строки (вместо простого перемещения курсора). Для удобства tput cuu1 переместит курсор вверх на одну строку. Итак, если в вашем скрипте bash вы объявляете такие переменные, как:

UPLINE=$(tput cuu1)
ERASELINE=$(tput el)

Затем вы можете написать такой скрипт:

UPLINE=$(tput cuu1)
ERASELINE=$(tput el)
echo "One Line"
echo "Two Lines"
echo "$UPLINE$ERASELINE$UPLINE$ERASELINE\c"
echo "Three Lines"
echo "Four Lines"

и вы получите желаемый результат.

person jrbalsano    schedule 25.05.2013
comment
Я хотел бы прокомментировать, что вам может понадобиться использовать опцию -e в этой строке: echo -e "$UPLINE$ERASELINE$UPLINE$ERASELINE\c". И \c означает, что вы удаляете последний разрыв строки или около того; Я подозреваю, что это башизм? В любом случае, большое спасибо за этот ответ, это было очень полезно! - person Esmu Igors; 22.09.2020