Как удалить строку с эхом?

Я использую тему/сценарии носатых цветов для одного из моих рабочих столов. Это - довольно удобный для пользователя путь, для начала носатый.

63
04.09.2016, 00:40
6 ответов

Можно использовать \b или \r положить обратно курсор и затем перезаписать печатный символ с новым символом. Отметьте это ни один \b ни \r удаляет печатные символы. Это просто кладет обратно курсор. \b перемещается курсор поддерживают один символ и \r перемещает курсор в начало строки.

Пример: оба

echo -e 'foooo\b\b\b\b\bbar'

и

echo -e 'foooo\rbar'

распечатает:

baroo

Если Вы хотите символы, удаленные затем, необходимо использовать следующее обходное решение:

echo -e 'fooooo\r     \rbar'

вывод:

bar  

Выборка от man echo:

   If -e is in effect, the following sequences are recognized:

   \0NNN  the character whose ASCII code is NNN (octal)

   \\     backslash

   \a     alert (BEL)

   \b     backspace

   \c     produce no further output

   \f     form feed

   \n     new line

   \r     carriage return

   \t     horizontal tab

   \v     vertical tab

   NOTE: your shell may have its own version of echo, which usually super‐
   sedes the version described here.  Please refer to your  shell's  docu‐
   mentation for details about the options it supports.
56
27.01.2020, 19:32
  • 1
    Да, но echo -e 'fooooooooo\rbar эхо barooooooo. –  Mat 11.12.2011, 13:40
  • 2
    Да Вы правы. Отметьте это echo -e 'foooo\b\b\b\b\b\b\b\b\b\bbar' также эхо baroo. –  lesmana 11.12.2011, 13:46
  • 3
    Настолько сладкий, работы даже безупречно в printf. –  Michael-O 06.06.2013, 18:07
  • 4
    Очень неточный ответ. Kevin каждый действительно лучше –  Mike Aski 15.06.2016, 18:47

Вы ищете терминальные Escape. В частности, для очистки от позиции курсора до начала строки:

echo -e "\033[1K"

Или все на строке, независимо от позиции курсора:

echo -e "\033[2K"

И можно сделать все виды других аккуратных приемов с терминальными Escape также.

92
27.01.2020, 19:32
  • 1
    Это принимает VT100-совместимый терминал или эмулятор (который является довольно безопасным предположением в эти дни). прохладный –  Keith Thompson 12.12.2011, 03:46
  • 2
    , Если Вы хотите стереть что-то, что Вы просто повторили, Ваше предыдущее эхо должно иметь флаг-n, или Вы будете отправлены в новую строку –  djjeck 20.11.2014, 03:45
  • 3
    , Если Вы захотите записать что-то еще, на строке Вы стираете, добавляете флаг-n на эхе выше, или иначе Вы перейдете к новой строке прямо после удаления его. Кроме того, добавьте \r к строке выше, или Ваше новое содержание не перейдет к началу той строки. –  djjeck 20.11.2014, 03:46
  • 4
    1 | -e как echo аргументом не является POSIX, совместимый +, мне не нравятся escape-последовательности. Любой предпочитает printf или tput. –  LinuxSecurityFreak 03.02.2018, 12:23

Если Вы хотите очистить строку, то я предлагаю, чтобы Вы использовали комбинацию людей возврата каретки, упоминают и terminfo.

# terminfo clr_eol
ceol=$(tput el)
echo -ne "xyzzyxyzzy\r${ceol}foobar"

Это запишет xyzzyxyzzy, затем возвратитесь к началу строки и отправьте "ясный концу строки" последовательность к терминалу, затем запишите foobar. -n заставляет эхо не добавить новую строку после foobar.

35
27.01.2020, 19:32
  • 1
    мне нравится вид соответствующей требованиям завтрашнего дня части этого определенного решения - использующий tput возможно, означает, что это будет работать над любым видом терминала. –  Amos Shapira 06.11.2014, 03:36
  • 2
    Лучше как printf '%s\r%s%s' xyzzyxyzzy "$ceol" foobar для мобильности и постараться не иметь содержание $ceol прохождение через \x расширение. –  Stéphane Chazelas 08.11.2016, 11:49

Вы явно просите echo, но этот запрос придавливает Вас. Вот подход, который использует встроенный удар printf команда с расширением фигурной скобки:

printf 'fooooooooo' # 10 characters
printf '\r'; printf ' %0.s' {0..9} # 10 expansions of the space character
11
27.01.2020, 19:32
  • 1
    ! точно, что мне был нужен –  Omar S. 26.03.2013, 19:09
  • 2
    printf 'Состояние: запущенный'; спите 2 с; printf '\r'; printf 'Состояние: обновленный'; спите 2 с; printf '\r'; –  Omar S. 26.03.2013, 19:15

Вместо echo -en "\ r" вы также можете найти полезной команду printf "\ r" . Таким образом вы можете отформатировать строку. например:

for sec in {1..100}; do printf "\r %04d" ${sec}; sleep 0.1; done

Я обычно делаю это также при медленном синтаксическом анализе файлов, чтобы отобразить текущее имя файла без создания списка

1
27.01.2020, 19:32

Вот пример использования параметров echo без новой строки-nи возврата каретки \r.

bash overwrite terminal line

#!/bin/bash

CHECK_MARK="\033[0;32m\xE2\x9C\x94\033[0m"

echo -e "\n\e[4mDoing Things\e[0m"
echo -n "doing thing 1..."
sleep 1
echo -e "\\r${CHECK_MARK} thing 1 done"
13
27.01.2020, 19:32

Теги

Похожие вопросы