GNU/Linux >> Znalost Linux >  >> Linux

Vymazat aktuální vytištěný řádek konzoly

Některé užitečné jemnosti...

\33[2K vymaže celý řádek, na kterém je aktuálně kurzor

\033[A přesune kurzor o jeden řádek nahoru, ale ve stejném sloupci tj. ne na začátek řádku

\r přenese váš kurzor na začátek řádku (r je pro návrat vozíku Poznámka:návrat vozíku nezahrnuje nový řádek, takže kurzor zůstane na stejném řádku), ale není vymazat cokoliv

Konkrétně v xtermu jsem zkusil výše uvedené odpovědi a jediný způsob, jak jsem našel, jak vymazat řádek a začít znovu na začátku, je sekvence (z výše uvedeného komentáře zveřejněného @Stephan202 a také @vlp a @mantal) \33[2K\r

Poznámka k implementaci, aby to fungovalo správně, například ve scénáři odpočítávání, protože jsem nepoužíval nový řádek znak '\n' na konci každého fprintf() , takže jsem musel fflush() stream pokaždé (abyste měli nějaký kontext, spustil jsem xterm pomocí fork na linuxovém stroji bez přesměrování stdout, pouze jsem zapisoval do bufferovaného ukazatele FILE fdfile s neblokujícím deskriptorem souboru jsem seděl na pseudoterminálové adrese, která v mém případě byla /dev/pts/21 ):

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

Všimněte si, že jsem použil obě sekvence \33[2K k vymazání řádku následovaného \r sekvence návratu vozíku pro přemístění kurzoru na začátek řádku. Musel jsem fflush() po každém fprintf() protože na konci nemám znak nového řádku '\n' . Stejný výsledek bez potřeby fflush() by vyžadoval další sekvenci, která by šla o řádek nahoru:

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

Všimněte si, že pokud máte něco na řádku bezprostředně nad řádkem, na který chcete psát, bude to přepsáno prvním fprintf(). Pro první pohyb o řádek nahoru byste museli ponechat jeden řádek navíc:

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

Můžete použít únikové kódy VT100. Většina terminálů, včetně xterm, podporuje VT100. Pro vymazání řádku je to ^[[2K . V C to dává:

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

Můžete použít \r (carriage return) pro návrat kurzoru na začátek řádku:

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

Tím se vytiskne sbohem na stejné lince. Nevymaže však stávající znaky a protože nashledanou je kratší než ahoj , skončíte s byelo . Chcete-li jej vymazat, můžete nový tisk prodloužit, aby se přepsaly další znaky:

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

Nebo jej nejprve smažte pomocí několika mezer a poté vytiskněte nový řetězec:

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

Tím se vytiskne ahoj , pak přejděte na začátek řádku a přepište jej mezerami, poté se vraťte znovu na začátek a vytiskněte sbohem .


Linux
  1. Připojit odpovídající text k řádku?

  2. Jak vymažu tištěné znaky v konzolové aplikaci (Linux)?

  3. ^M na konci každého řádku ve vim

  1. 8 tipů pro příkazový řádek Linuxu

  2. Naučte se používat textový editor Sed

  3. Řazení na posledním poli řádku

  1. Seřadit pomocí řazení na příkazovém řádku

  2. Jaká je aktuální úroveň běhu systému Linux?

  3. Výzva terminálu přepíše aktuální řádek?