una sustituir script programacion manejo especiales eliminar ejemplos comando caracteres caracter cadenas cadena buscar bash char sleep ifs

sustituir - bash: leer texto de una cadena de a un carácter a la vez, con espacios en blanco



programacion shell linux ejemplos (3)

Qué tal si

#!/bin/bash function typewriter { text="$1" delay="$2" for i in $(seq 0 $(expr length "${text}")) ; do echo -n "${text:$i:1}" sleep ${delay} done } typewriter "Typewriters are cool." .1 echo # <-- Just for a newline

Estoy aburrido y decidí escribir un guión para una aventura mía basada en texto utilizando bash. Básicamente, se supone que debe animar una máquina de escribir en ciertos casos para contar historias dramáticas. Puedo hacer esto manualmente en un archivo como ese:

sleep 0.1 echo -n "h" sleep 0.1 echo -n "e" sleep 0.1 echo -n "l" sleep 0.1 echo -n "l" sleep 0.1 echo -n "o"

Como puedes imaginar, es tremendamente tedioso. En cambio, quiero extraer caracteres de una cadena (o archivo) un carácter a la vez, y aplicar el comando dormir a cada personaje.

Hasta ahora, tengo lo siguiente, que se lee de un archivo. IFS = permite retener los espacios, pero no cualquier otro tipo de espacio en blanco (como nueva línea).

IFS= while read -n1 achar do echo $achar done < aFile

¿Hay alguna manera de que pueda usar esto para obtener todos los espacios en blanco? Como una pregunta de bonificación, ¿puede decirme cómo aplicar esto a un script definido por el usuario, para que no tenga que leer desde un archivo separado? Entonces, por ejemplo, digamos que tengo una cadena llamada "hola", y simplemente puedo pasarla a mi función para animarla como una máquina de escribir cada vez que ejecuto mi archivo en la terminal de bash.

Cualquier ayuda sería apreciada. ¡Gracias!


@derp no necesita usar tr -s [:blank:] para exprimir múltiples espacios en blanco a uno solo.

HTH.


Para responder la pregunta original, debe usar un delimitador vacío también:

#!/bin/bash getc() { IFS= read -r -n1 -d '''' "$@" } typewriter() { while getc ch; do sleep 0.1; echo "$ch" done }

Básicamente, la read se detendrá en las líneas nuevas (el delimitador predeterminado) incluso si aún no ha consumido suficientes caracteres. La bandera -r también le dice que deje las barras invertidas solo.

Explicación completa aquí: http://jayferd.us/posts/2011-01-12-bash-adventures-read-a-single-character-even-if-its-a-newline