GNU/Linux >> Tutoriels Linux >  >> Linux

Effacer la ligne de console imprimée actuelle

Quelques subtilités intéressantes...

\33[2K efface toute la ligne sur laquelle se trouve actuellement votre curseur

\033[A déplace votre curseur d'une ligne vers le haut, mais dans la même colonne c'est-à-dire pas au début de la ligne

\r amène votre curseur au début de la ligne (r est pour le retour chariot N.B. les retours chariot n'incluent pas de saut de ligne donc le curseur reste sur la même ligne) mais ne le fait pas effacer quoi que ce soit

Dans xterm spécifiquement, j'ai essayé les réponses mentionnées ci-dessus et le seul moyen que j'ai trouvé pour effacer la ligne et recommencer au début est la séquence (du commentaire ci-dessus posté par @Stephan202 ainsi que @vlp et @mantal) \33[2K\r

Sur une note d'implémentation, pour le faire fonctionner correctement, par exemple dans un scénario de compte à rebours puisque je n'utilisais pas de caractère de nouvelle ligne '\n' à la fin de chaque fprintf() , donc j'ai dû fflush() le flux à chaque fois (pour vous donner un peu de contexte, j'ai démarré xterm en utilisant un fork sur une machine Linux sans rediriger stdout, j'écrivais juste dans le pointeur FILE tamponné fdfile avec un descripteur de fichier non bloquant que j'avais assis sur la pseudo adresse du terminal qui dans mon cas était /dev/pts/21 ):

fprintf(fdfile, "\33[2K\rT minus %d seconds...", i);
fflush(fdfile);

Notez que j'ai utilisé à la fois la séquence \33[2K pour effacer la ligne suivie du \r séquence de retour chariot pour repositionner le curseur en début de ligne. J'ai dû fflush() après chaque fprintf() parce que je n'ai pas de caractère de saut de ligne à la fin '\n' . Le même résultat sans avoir besoin de fflush() nécessiterait la séquence supplémentaire pour remonter d'une ligne :

fprintf(fdfile, "\033[A\33[2K\rT minus %d seconds...\n", i);

Notez que si vous avez quelque chose sur la ligne immédiatement au-dessus de la ligne sur laquelle vous voulez écrire, il sera écrasé par le premier fprintf(). Vous devrez laisser une ligne supplémentaire au-dessus pour permettre le premier mouvement vers le haut d'une ligne :

i = 3;
fprintf(fdfile, "\nText to keep\n");
fprintf(fdfile, "Text to erase****************************\n");
while(i > 0) { // 3 second countdown
    fprintf(fdfile, "\033[A\33[2KT\rT minus %d seconds...\n", i);
    i--;
    sleep(1);
}

Vous pouvez utiliser les codes d'échappement VT100. La plupart des terminaux, y compris xterm, sont compatibles VT100. Pour effacer une ligne, c'est ^[[2K . En C cela donne :

printf("\33[2K\r");

Vous pouvez utiliser un \r (retour chariot) pour ramener le curseur en début de ligne :

printf("hello");
printf("\rbye");

Cela affichera au revoir sur la même ligne. Cependant, cela n'effacera pas les caractères existants, et parce que au revoir est plus court que bonjour , vous vous retrouverez avec byelo . Pour l'effacer, vous pouvez allonger votre nouvelle impression pour écraser les caractères supplémentaires :

printf("hello");
printf("\rbye  ");

Ou, effacez-le d'abord avec quelques espaces, puis imprimez votre nouvelle chaîne :

printf("hello");
printf("\r          ");
printf("\rbye");

Cela affichera bonjour , puis allez au début de la ligne et écrasez-la avec des espaces, puis revenez au début et écrivez bye .


Linux
  1. 8 conseils pour la ligne de commande Linux

  2. Apprendre à utiliser l'éditeur de texte Sed

  3. Avoir une vache à la ligne de commande Linux

  4. Enfermez-vous sur la ligne de commande Linux

  5. Compter les caractères de chaque ligne avec Wc ?

Programmer le matériel à partir de la ligne de commande Linux

Maîtrisez la ligne de commande Linux

Changer la police de la console en mode texte ?

Sauter au début de la ligne en mode Vi de Bash ?

Ajouter le texte correspondant à la ligne ?

Tri sur le dernier champ d'une ligne