GNU/Linux >> Tutoriales Linux >  >> Linux

Borrar la línea de consola impresa actual

Algunas sutilezas que valen la pena...

\33[2K borra toda la línea en la que se encuentra actualmente el cursor

\033[A mueve el cursor una línea hacia arriba, pero en la misma columna es decir, no al comienzo de la línea

\r lleva el cursor al principio de la línea (r es para retorno de carro N.B. los retornos de carro no incluyen una nueva línea, por lo que el cursor permanece en la misma línea) pero no borra cualquier cosa

Específicamente en xterm, probé las respuestas mencionadas anteriormente y la única forma que encontré para borrar la línea y comenzar de nuevo desde el principio es la secuencia (del comentario anterior publicado por @Stephan202, así como @vlp y @mantal) \33[2K\r

En una nota de implementación, para que funcione correctamente, por ejemplo, en un escenario de cuenta regresiva, ya que no estaba usando un carácter de nueva línea '\n' al final de cada fprintf() , así que tuve que fflush() la transmisión cada vez (para darle un poco de contexto, comencé xterm usando una bifurcación en una máquina Linux sin redirigir stdout, solo estaba escribiendo en el puntero de ARCHIVO almacenado en búfer fdfile con un descriptor de archivo sin bloqueo que tenía sentado en la dirección del pseudo terminal que en mi caso era /dev/pts/21 ):

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

Tenga en cuenta que utilicé la secuencia \33[2K para borrar la línea seguida por el \r secuencia de retorno de carro para cambiar la posición del cursor al principio de la línea. Tuve que fflush() después de cada fprintf() porque no tengo un carácter de nueva línea al final '\n' . El mismo resultado sin necesidad de fflush() requeriría la secuencia adicional para subir una línea:

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

Tenga en cuenta que si tiene algo en la línea inmediatamente encima de la línea en la que desea escribir, se sobrescribirá con el primer fprintf(). Tendría que dejar una línea adicional arriba para permitir el primer movimiento hacia arriba una línea:

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);
}

Puede utilizar códigos de escape VT100. La mayoría de los terminales, incluido xterm, son compatibles con VT100. Para borrar una línea, esto es ^[[2K . En C esto da:

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

Puedes usar un \r (retorno de carro) para devolver el cursor al principio de la línea:

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

Esto imprimirá adiós en la misma línea. Sin embargo, no borrará los caracteres existentes, y porque adiós es más corto que hola , terminarás con byelo . Para borrarlo, puede hacer que su nueva impresión sea más larga para sobrescribir los caracteres adicionales:

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

O bien, primero bórrelo con unos pocos espacios, luego imprima su nueva cadena:

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

Eso imprimirá hola , luego vaya al principio de la línea y sobreescríbala con espacios, luego vuelva al principio e imprima adiós .


Linux
  1. 8 consejos para la línea de comandos de Linux

  2. Aprende a usar el editor de texto Sed

  3. ¿Cuál es el nivel de ejecución actual del sistema Linux?

  4. ¿El indicador de terminal sobrescribe la línea actual?

  5. ¿Cambiar la fuente de la consola de modo de texto?

Programe hardware desde la línea de comandos de Linux

Tener una vaca en la línea de comandos de Linux

Encárguese en la línea de comandos de Linux

Domina la línea de comandos de Linux

¿Contar los caracteres de cada línea con Wc?

¿Adjuntar el texto coincidente a la línea?