Como deletar linha com echo?

53

Eu sei que posso excluir os últimos três caracteres com:

echo -ne '\b\b\b'

Mas como posso excluir uma linha completa? Quer dizer, eu não quero usar:

echo -ne '\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b'

... etc ... para excluir uma linha longa.

    
por LanceBaynes 11.12.2011 / 12:24

8 respostas

53

Você pode usar \b ou \r para mover o cursor de volta e, em seguida, substituir o caractere impresso por um novo caractere. Observe que nem \b nem \r exclui os caracteres impressos. Apenas move o cursor de volta. \b move o cursor para trás um caractere e \r move o cursor para o começo da linha.

Exemplo: ambos

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

e

echo -e 'foooo\rbar'

imprimirá:

baroo

Se você deseja que os caracteres sejam excluídos, use a seguinte solução alternativa:

echo -e 'fooooo\r     \rbar'

saída:

bar  

Trecho de man echo :

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

   
echo -e 'foooo\b\b\b\b\bbar'
NNN 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.
    
por 11.12.2011 / 12:37
76

Você está procurando por escapes de terminal . Em particular, para limpar da posição do cursor para o início da linha:

echo -e "3[1K"

Ou tudo na linha, independentemente da posição do cursor:

echo -e "3[2K"

E você pode fazer todo tipo de truques com escapes terminais também.

    
por 11.12.2011 / 21:50
31

Se você quiser limpar a linha, sugiro usar uma combinação do retorno de carro que as pessoas estão mencionando e terminfo.

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

Isso gravará xyzzyxyzzy , depois retornará ao início da linha e enviará a seqüência "limpar para final de linha" para o terminal e, em seguida, escreverá foobar . O -n faz com que o eco não adicione uma nova linha após o foobar .

    
por 11.12.2011 / 19:16
10

Você pede explicitamente por echo , mas esse pedido o atrapalha. Aqui está uma abordagem que usa o comando printf do bash com expansão de chaves:

printf 'fooooooooo' # 10 characters
printf '\r'; printf ' %0.s' {0..9} # 10 expansions of the space character
    
por 11.12.2011 / 17:35
1

Veja um exemplo usando as opções sem nova linha -n e retorno de carro \r do echo

#!/bin/bashCHECK_MARK="3[0;32m\xE2\x9C\x943[0m"

echo -e "\n\e[4mDoing Things\e[0m"
echo -n "doing thing 1..."
sleep 1
echo -e "\r${CHECK_MARK} thing 1 done"
    
por 18.04.2018 / 00:40
0

Em vez de echo -en "\r" , você também pode achar o comando printf "\r" útil. Desta forma você pode formatar a string. por exemplo:

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

Eu geralmente faço isso também quando opero com análise lenta de arquivos para exibir o nome do arquivo em andamento sem criar uma lista

    
por 08.11.2016 / 10:13
0

Como pergunta, apague a linha completa

Eu usei o comando abaixo com a combinação de echo e sed para excluir a linha

Após a execução do resultado do comando será vazio.porque a linha será substituída por nenhuma

comando

echo  "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" | sed -r "s/.*//g"
    
por 03.02.2018 / 14:45
-1

Aqui está um exemplo de cronômetro que uso:

i=10; while [ $i -gt 0 ]; do printf "$i seconds remaining       " && printf '\r3[1B'; i='expr $i - 1'; sleep 1; printf '3[1A';  done
    
por 15.12.2017 / 17:30