SoloCodigo

Sistemas Operativos => GNU/Linux => Mensaje iniciado por: badyalberto en Domingo 18 de Octubre de 2009, 14:18

Título: Leer fichero caracter por caracter
Publicado por: badyalberto en Domingo 18 de Octubre de 2009, 14:18
Como puedo leer de un fichero de texto caracter por caracter ?
Estoy haciendo un script en bash que necesito que lea los caracteres de un fichero y me cambie una vocales por otra.
Yo lo que utilizo es:

while read linea
do
         caracter=${linea:0:1}
# luego aqui dentro hago un case para q dependiendo de q letra lea la cambie por una o otra.
done
Pero asi solo me lee un caracter de una linea, las lineas no son del mismo tamaño ni tienen los mismo campos :S
Título: Re: Leer fichero caracter por caracter
Publicado por: su - en Domingo 18 de Octubre de 2009, 17:46
Código: Bash
  1. cat texto | while read -n 1 i; do echo $i; done
  2.  
Con eso lo haces  ;) pero ten en cuenta que tienes que crear un archivo nuevo para guardar lo que remplazas (no puedes escribir encima).
Título: Re: Leer fichero caracter por caracter
Publicado por: badyalberto en Domingo 18 de Octubre de 2009, 18:09
no entiendo eso del while read -1 2 i;

Yo ahora habia quitado el while read y lo habia puesto directo algo asi:

cat poema2 | tr "e" "a">poema3
cat poema2 | tr "i" "e">poema3
cat poema2 | tr "o" "u">poema3
cat poema2 | tr "u" "o">poema3
cat poema2 | tr "a" "u">poema3

Pero veo q solo hace el ultimo cat :S
Título: Re: Leer fichero caracter por caracter
Publicado por: su - en Domingo 18 de Octubre de 2009, 19:44
La solucion con tr seria esta:
Código: Bash
  1. cat poema2 | tr "e" "a" > poema3
  2. cat poema3 | tr "i" "e" > poema4
  3. cat poema4 | tr "o" "u" > poema5
  4. cat poema5 | tr "u" "o" > poema6
  5. cat poema7 | tr "a" "u" > poema8
  6.  
De lo contrario estarias aplicando el tr solo a poema2, borrano y creando nuevamente poema3.

Lo de while es simple: le pasamos a while la salida de cat usando pipes (el |) y de ahi, este lee 1 byte (ese es el flag -n 1) que es un caracter y lo asigna a $i.
En ese ejemplo, read incluye retornos de carro ("n") y todo tipo de caracteres.

Ahora, te toca ver como usar while, read e if para hacer lo que quieres... o usar la otra solucion.
Título: Re: Leer fichero caracter por caracter
Publicado por: m0skit0 en Lunes 19 de Octubre de 2009, 14:41
Puedes usar >> (redirect append) en vez de > (redirect overwrite)...
Título: Re: Leer fichero caracter por caracter
Publicado por: su - en Miércoles 21 de Octubre de 2009, 03:47
Cita de: "m0skit0"
Puedes usar >> (redirect append) en vez de > (redirect overwrite)...
Pero eso es justamente el problema, >> no borra lo anterior, lo "agrega en pila".
Eso se podria hacer de una forma optima con en C usando seek, read y mucha paciencia o con Perl y Tie::File de una forma fácil (usando arrays), o con while, read e if usando Bash  :P
Título: Re: Leer fichero caracter por caracter
Publicado por: m0skit0 en Miércoles 21 de Octubre de 2009, 10:43
Ah, perdón perdón, entendí el problema al revés  :unsure: