• Domingo 5 de Mayo de 2024, 09:39

Autor Tema:  Leer fichero caracter por caracter  (Leído 4084 veces)

badyalberto

  • Miembro activo
  • **
  • Mensajes: 77
    • Ver Perfil
Leer fichero caracter por caracter
« en: Domingo 18 de Octubre de 2009, 14:18 »
0
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

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Leer fichero caracter por caracter
« Respuesta #1 en: Domingo 18 de Octubre de 2009, 17:46 »
0
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).
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

badyalberto

  • Miembro activo
  • **
  • Mensajes: 77
    • Ver Perfil
Re: Leer fichero caracter por caracter
« Respuesta #2 en: Domingo 18 de Octubre de 2009, 18:09 »
0
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

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Leer fichero caracter por caracter
« Respuesta #3 en: Domingo 18 de Octubre de 2009, 19:44 »
0
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.
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Leer fichero caracter por caracter
« Respuesta #4 en: Lunes 19 de Octubre de 2009, 14:41 »
0
Puedes usar >> (redirect append) en vez de > (redirect overwrite)...

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Leer fichero caracter por caracter
« Respuesta #5 en: Miércoles 21 de Octubre de 2009, 03:47 »
0
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
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Leer fichero caracter por caracter
« Respuesta #6 en: Miércoles 21 de Octubre de 2009, 10:43 »
0
Ah, perdón perdón, entendí el problema al revés  :unsure: