[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [OT] Re: Contar caracteres en tiempo real



2010/11/15 Marc Aymerich <glicerinu@gmail.com>:
> 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"

para ser un poco rigurosos el string resultante no es $out sino $cad:
echo -ne "\nResulting string: $cad\n"



-- 
Marc


Reply to: