[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 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: