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

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



2010/11/13 rantis cares <rantiscares@gmail.com>:
> El día 13 de noviembre de 2010 15:35, Marc Aymerich
> <glicerinu@gmail.com> escribió:
>> 010/11/13 rantis cares <rantiscares@gmail.com>:
>>> El día 13 de noviembre de 2010 13:03, rantis cares
>>> <rantiscares@gmail.com> escribió:
>>>> El día 13 de noviembre de 2010 12:49, Camaleón <noelamac@gmail.com> escribió:
>>>>> El Sat, 13 Nov 2010 11:54:27 -0600, rantis cares escribió:
>>>>>
>>>>> Te lo marco como OT para que no se nos enfaden...
>>>>
>>>> ¿Que es eso de que me lo marques como OT para que no se enfaden?
>>>>
>>>>>
>>>>>> Quiero contar el numero de caracteres mediante un script en bash pero
>>>>>> cada vez que ingrese un caracter, que lo vaya contando en tiempo real.
>>>>>> El comando wc lo hace, pero cuando existe un archivo y no es en tiempo
>>>>>> real.
>>>>>>
>>>>>> yo quiero hacer algo así:
>>>>>>
>>>>>> #!/bin/bash
>>>>>>
>>>>>> echo "Contare los caracteres como los vas ingresando"
>>>>>> read -p "Contador: "
>>>>>
>>>>> Sí, con wc... ¿por qué no?
>>>>>
>>>>> #!/bin/bash
>>>>>
>>>>> echo "Contare los caracteres como los vas ingresando"
>>>>> echo "Contador: "
>>>>> read conta
>>>>> echo -n $conta | wc -m
>>>>>
>>>>> Sólo te queda pulirlo un poco para que admita la introducción de retornos
>>>>> de carro y añadir el factor "tiempo real" (quizá debas tirar de ncurses
>>>>> para pintar una pantalla con dos campos, uno para la introducción de
>>>>> datos y otro que vaya mostrando el contenido del contador) ;-P
>>>>
>>>> Me gusto un poco, la verdad es que yo quisiera que lo mostrara en
>>>> tiempo real. La verdad es que no estoy usando ncurses, me gustaria
>>>> todo muy sencillo, en bash.
>>>>
>>>> Claro que no voy a escribir muchos caracteres, pero si creo que hare
>>>> un pequeño bucle para conseguir lo que quiero y algunas condiciones
>>>> como
>>>>
>>>> maximo=(igual o menor que)50
>>>>
>>>>
>>>>
>>>> if $texto cumple esta condicion $maximo
>>>> entonces que ejecute la accion
>>>> finaliza
>>>>
>>>> sino
>>>> entonces que se repita el ingreso del texto
>>>>
>>>> Gracias
>>>>
>>>> P.D. Yo no sabia que no eras Camaleón, sino que eres Camaleona :D
>>>>
>>>
>>> Bien he realizado el script para contar los caracteres, tal vez no en
>>> tiempo real, pero para pequeños ingresos de texto que funcionen.
>>>
>>> Si alguno tiene una mejor idea, o alguna sugerencia que pudiera hacer
>>> que se viera en tiempo real, se los agradecere.
>>>
>>
>> #!/bin/bash
>> while read -n1 c; do
>> a="$a$c"
>> echo -en "\r$a   "$(($(echo $a|wc -c) -1));
>> done
>>
>
> Marc:
>
> Cuando copie el codigo y vi los resultados, la verdad es que me gusto
> la manera de resolver este problema, me parecio genial, de hecho me
> puse a reir por la genialidad de la respuesta.
>
> Solo que al estar aprendiendo, no se que tanto sigjifica esto, pero
> funciona a medias, te diré porque:
>
> 1. No me acepta los espacios, tengo que poner la barra inversa \ y
> posteriormente tengo que presionar la barra espaciadora.
> 2. Si me equivoco, no puedo borrar y ademas cada que presiono la tecla
> delete, me lo cuenta como un caracter.
> 3. Cuando llega al final de la pantalla, vuelve a escribir todo y
> dicha pantalla se llena del mismo mensaje cada vez que escribo un
> nuevo caracter hasta que termina pareciendose una piramide.
>
> Decir esto, no significa que no valore el script, quisiera yo tener el
> conocimiento para desarrollar la genialidad con la que contaste los
> caracteres.
>
> Agradeceria si me ayudaras a resolver estos "inconvenientes", y aun si
> no lo hicieras, creo que ya hiciste mucho, en lo que a mi corresponde
> me pondre a investigar porque me has mostrado el camino para llegar a
> donde quiero llegar.
>
> Gracias
>
> P.D. Acepto mas sugerencias
>

rantis, para el espacio puedes solucionarlo así:

while IFS= read -r -n1 c; do
....

Para finalizar cuando pulsas enter tendrías que poner algo parecido a
esto al principio del bucle:
if [ "$c" == "$(echo)" ]; then break; fi


Hasta aquí y sumando las mejoras de javier :) tendriamos esto:

while IFS= read -r -n1 c; do
if [ "$c" == "$(echo)" ]; then break; fi
a="$a$c"
echo -en "\r$a   "$(($(echo $a|wc -c) -1));
done

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 :) .

saludos.


-- 
Marc


Reply to: