web-dev-qa-db-fra.com

Comment supprimer la ligne avec écho?

Je sais que je pourrais supprimer les trois derniers caractères avec:

echo -ne '\b\b\b'

Mais comment supprimer une ligne complète? Je veux dire que je ne veux pas utiliser:

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 ... pour supprimer une longue ligne.

66
LanceBaynes

Vous pouvez utiliser \b ou \r pour déplacer le curseur vers l'arrière, puis remplacer le caractère imprimé par un nouveau caractère. Notez que ni \b ni \r supprime les caractères imprimés. Il déplace simplement le curseur vers l'arrière. \b recule le curseur d'un caractère et \r déplace le curseur au début de la ligne.

Exemple: les deux

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

et

echo -e 'foooo\rbar'

imprimera:

baroo

Si vous souhaitez que les caractères soient supprimés, vous devez utiliser la solution de contournement suivante:

echo -e 'fooooo\r     \rbar'

production:

bar  

Extrait 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.
57
lesmana

Vous recherchez le terminal s'échappe . En particulier, pour effacer de la position du curseur au début de la ligne:

echo -e "\033[1K"

Ou tout sur la ligne, quelle que soit la position du curseur:

echo -e "\033[2K"

Et vous pouvez aussi faire toutes sortes d'autres astuces avec des échappements de terminal.

100
Kevin

Si vous souhaitez effacer la ligne, je vous suggère d'utiliser une combinaison des retours de chariot mentionnés et terminfo.

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

Cela va écrire xyzzyxyzzy, puis retourner au début de la ligne et envoyer la séquence "clear to end of line" au terminal, puis écrire foobar. Le -n fait en sorte que l'écho n'ajoute pas de nouvelle ligne après le foobar.

36
Arcege

Vous demandez explicitement echo, mais cette demande vous épingle. Voici une approche qui utilise la commande intégrée printf de bash avec une extension d'accolade:

printf 'fooooooooo' # 10 characters
printf '\r'; printf ' %0.s' {0..9} # 10 expansions of the space character
11
kojiro

Voici un exemple utilisant echo's no newline -n et retour chariot \r options.

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"
7
Derek Soike

Au lieu de echo -en "\r" vous pouvez également trouver le printf "\r" commande aussi utile. De cette façon, vous pouvez formater la chaîne. par exemple.:

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

Je le fais généralement aussi lorsque j'utilise l'analyse de fichiers lente pour afficher le nom de fichier en cours sans créer de liste

1
McPeppr

Comme la question est de supprimer la ligne complète

J'ai utilisé la commande ci-dessous avec une combinaison de echo et sed pour supprimer la ligne

Après l'exécution de la commande, le résultat sera vide, car la ligne sera remplacée par aucune

commander

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"
0
Praveen Kumar BS