Bash replace les caractères dans la sortie

J'ai besoin de replace des caractères dans la sortie d'un script, mais ils ne sont pas dans la dernière ligne imprimée. Ils sont au milieu de la sortie.

Par exemple

XX----------------------------------------------------------XX |XXX |XXX | XX | XXX | XX------------------------------------------------------+-----XXX | | + | | +----------------------------------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 12:34:56 <------+ Characters to replace! | | | | | | | | | <--------------------------+ | | | | | | | | | | | | | | | | | +XX--+ | | | XX | +----------------------------------------------------+ | XXX | +--------------------------------------------------------------+ 

le code:

 #!/bin/bash function printThing(){ local timeVar=$(date +"%T") local lines=( ' XX----------------------------------------------------------XX' ' |XXX |XXX' ' | XX | XXX' ' | XX------------------------------------------------------+-----XXX' ' | | +' ' | | +----------------------------------------------------+ |' ' | | | | |' ' | | | | |' ' | | | | |' ' | | | | |' ' | | | | |' " | | | $timeVar <------+ Characters to replace! |" ' | | | | |' ' | | | <--------------------------+ | |' ' | | | | |' ' | | | | |' ' | | | | |' ' +XX--+ | | |' ' XX | +----------------------------------------------------+ |' ' XXX |' ' +--------------------------------------------------------------+' ) for i in "${lines[@]}" do echo "$i" done while : do local timeVar=$(date +"%T") #Replace the time in the ssortingngs printed above sleep 1 done } printThing 

Comment puis-je replace la valeur du time sans gâcher toute la layout?

Si ncurses installé, vous pouvez utiliser la command tput pour placer le slider sur le terminal, où vous pouvez utiliser n'importe quelle command d'printing.

Exemple:

 clear for i in $(seq 1 40) do echo '## ##' done for i in $(seq 1 100) do tput cup 20 5 date sleep 1 done 

Vous voudrez peut-être déplacer le slider quelque part avant de quitter la fonction. Par exemple en utilisant

 tput cup $(tput lines) 0 

Ce qui le déplacera vers la dernière ligne du terminal.

Pour les terminaux qui le prennent en charge, vous pouvez utiliser le slider de sauvegarde et restaurer les séquences d'échappement du slider :

 #! /bin/sh - save_cursor=$(tput sc) restore_cursor=$(tput rc) text="\ XX----------------------------------------------------------XX |XXX |XXX | XX | XXX | XX------------------------------------------------------+-----XXX | | + | | +----------------------------------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | $save_cursor$(date +%T) <------+ Characters to replace! | | | | | | | | | <--------------------------+ | | | | | | | | | | | | | | | | | +XX--+ | | | XX | +----------------------------------------------------+ | XXX | +--------------------------------------------------------------+" printf '%s\n' "$text" while sleep 1; do printf %s "$restore_cursor$(date +%T)" done 

Peut-être quelque chose comme ça résout le problème:

 #!/bin/bash function printThing(){ local timeVar=$(date +"%T") local lines="\ XX----------------------------------------------------------XX |XXX |XXX | XX | XXX | XX------------------------------------------------------+-----XXX | | + | | +----------------------------------------------------+ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | $timeVar | | | | | | | | | | | | | | | | | | | | | | | | | | | +XX--+ | | | XX | +----------------------------------------------------+ | XXX | +--------------------------------------------------------------+" for i in "${lines[@]}" do echo "$i" done } printf "\033c" while : do timeVar=$(date +"%T") printThing sleep 1 printf "\033c" done