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.
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.
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.
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
.
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
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
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"