Re: [OT] Re: Contar caracteres en tiempo real
2010/11/15 Marc Aymerich <glicerinu@gmail.com>:
> 2010/11/15 Javier Barroso <javibarroso@gmail.com>:
>> 2010/11/14 Marc Aymerich <glicerinu@gmail.com>:
>>> 2010/11/14 Javier Barroso <javibarroso@gmail.com>:
>>>> 2010/11/13 Marc Aymerich <glicerinu@gmail.com>:
>>>>> Y Ahora para borrar tendrías que usar algo parecido a esto:
>>>>>
>>>>> if [ "$c" == "$(echo backspace)" ]; then a={$a%?}; fi
>>>>>
>>>>> Desgraciadamente esto ultimo no te va a funcionar, No se como hacer un
>>>>> echo del carácter backspace !! :D Pero si logras comparar $c con
>>>>> backspace ahí lo tienes :) .
>>>>
>>>> Puedes coger ese caracter con:
>>>>
>>>> backspace=$(echo -en '\b') al principio del script y luego usar
>>>> "$backspace" para comparar
>>>>
>>>> Sigo sin tener un bash a mano para hacer la prueba oportuna, pero creo
>>>> que podría funcionar como dice Marc
>>>
>>>
>>> Buenas Javier, el carácter backspace es un poco puñetero. Yo estoy
>>> probando con gnome-terminal y al parecer cuando pulsas backspace el
>>> carácter que le llega a bash no es "\b" sino "\x7F". No se si las
>>> otras terminales se comportan igual. Bueno que para que al menos a mi
>>> me funcione tengo que hacer la comparación así:
>>> if [ "$c" == "$(echo -ne "\x7F")" ]; then a=${a%?};
>>>
>>> y de ninguna otra manera he conseguido que funcione :(
>>>
>>>
>>> Rantis prueba este código a ver que te parece:
>>>
>>> #!/bin/bash
>>> while IFS= read -r -n1 c; do
>>> if [ "$c" == "$(echo)" ]; then break; fi
>>> if [ "$c" == "$(echo -ne "\x7F")" ]; then
>>> a=${a%?};
>>> echo -en "\r$a ${#a} "
>>> else a="$a$c"
>>> echo -en "\r$a ${#a}"
>>> fi
>>> done
>>> echo "El string resultante es: $a"
>>>
>>> Por desgracia aún faltaría pulir unos caracteres desagradables que
>>> aparecen al pulsar backspace.
>>
>> Se arregla con el -s en el read:
>> cad=""
>> while IFS= read -s -r -n 1 c; do
>> if [[ "$c" == $(echo -e '\x7f') ]]; then cad=${cad%?}; else cad="$cad$c"; fi;
>> printf "%-50s\r" "$cad [${#cad}]";
>> done
>
> Muy buena solución javier.
> Con esto hemos llevado el comando read al limite, pocas opciones hemos
> dejado para usar ;)
>
Ya veis lo aburrido que estoy hoy que me he tomado tiempo para decorar
un poco el programa:
#!/bin/bash
limit=140
cad=""
out=$(printf "\r$cad%$((${#cad}-$limit))s")
echo -ne "${out// /_} [${#cad}/$limit]"
while IFS= read -s -r -n 1 c; do
if [ "$c" == "$(echo)" ]; then break; fi
if [[ "$c" == $(echo -ne "\x7f") ]]; then
cad=${cad%?};
else
if [ ${#cad} == $limit ]; then
if [[ "$c" == $(echo -ne "\x7f") ]]; then
cad=${cad%?};
fi;
else
cad="$cad$c";
fi;
fi;
out=$(printf "$cad%$((${#cad}-$limit))s")
echo -ne "\r${out// /_} [${#cad}/$limit]"
done
echo -ne "\nResulting string: $out\n"
--
Marc
Reply to: