• Miércoles 7 de Junio de 2023, 17:38

Autor Tema:  Re: Fich. Unix con Perl  (Leído 2642 veces)

cedosd

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Fich. Unix con Perl
« en: Martes 17 de Septiembre de 2002, 11:27 »
0
Buenos días, yo tengo un fichero en Unix y necesito encontrar una línea de ese fichero con un determinado texto, posicionarme una línea más abajo y a partir de ahí, escribir varias líneas. ¿Se puede hacer esto en Perl?. La verdad es que estoy bloqueado y agradeceria cualquier ayuda.

Gracias!!

Avalon

  • Miembro MUY activo
  • ***
  • Mensajes: 449
    • Ver Perfil
Re: Fich. Unix con Perl
« Respuesta #1 en: Jueves 19 de Septiembre de 2002, 14:03 »
0
Hola,

Podrías hacer algo como esto:

 
Código: Text
  1.  
  2. # abres el fichero
  3. open(INPUT, "fichero.txt");
  4.  
  5. # guardas todo el contenido del fichero en una variable
  6. @contenido = <INPUT>;
  7.  
  8. # cierras el fichero
  9. close(INPUT);
  10.  
  11. # recorres los datos del fichero
  12. foreach $linea (@contenido) {
  13.  
  14.    chop($linea);
  15.  
  16.    # se busca la línea que contiene el texto que nos interesa
  17.    if ($linea =~ /b$texto/i) {
  18.       push(@nuevosdatos, $linea . "n");
  19.  
  20.       # Si se ha encontrado el texto, aquí añadirías las líneas que quieres insertar
  21.       push(@nuevosdatos, "Nueva linea 1n");
  22.       push(@nuevosdatos, "Nueva linea 2n");
  23.       push(@nuevosdatos, "Nueva linea 3n");
  24.  
  25.    }
  26.    else {
  27.       # se deja la línea como estaba
  28.       push(@nuevosdatos, $linea . "n");
  29.    }
  30. }
  31.  
  32. # Ahora vuelcas los nuevos datos en el fichero, borrando los datos que contenía anteriormente
  33.  
  34. open(OUTPUT, "+< fichero.txt");
  35.  
  36. foreach $linea (@nuevosdatos) {
  37.    print OUTPUT $linea;
  38. }
  39.  
  40. close(OUTPUT);
  41.  
  42.  

Espero que te sirva.

Salu2,
Avalon

cedosd

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Fich. Unix con Perl
« Respuesta #2 en: Viernes 20 de Septiembre de 2002, 12:43 »
0
Gracias, Avalon!!
El Lunes 23 te comento como ha ido el temilla.

cedosd

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Fich. Unix con Perl
« Respuesta #3 en: Martes 24 de Septiembre de 2002, 09:19 »
0
Gracias Avalon, funciona perfectamente......¡Tu si que sabes!!.

Avalon

  • Miembro MUY activo
  • ***
  • Mensajes: 449
    • Ver Perfil
Re: Fich. Unix con Perl
« Respuesta #4 en: Martes 24 de Septiembre de 2002, 21:35 »
0
No hay de que B)

Salu2,
Avalon

cedosd

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Fich. Unix con Perl
« Respuesta #5 en: Jueves 3 de Octubre de 2002, 10:47 »
0
Hola de nuevo, Avalon!.
Necesito de nuevo tu ayuda. Al pasar el programa a CGI me da error en la linea:
@contenido = <INPUT>;

con el error:
Global symbol "@contenido" requires explicit package name at ./prueba.cgi line
22.

Yo no se si es que la he definido mal o que...¿sabeis que puede ser?
Gracias de nuevo.

Avalon

  • Miembro MUY activo
  • ***
  • Mensajes: 449
    • Ver Perfil
Re: Fich. Unix con Perl
« Respuesta #6 en: Jueves 3 de Octubre de 2002, 11:11 »
0
Así a bote pronto lo único que se me ocurre es que estés utilizando la claúsula use strict en tu código, con lo cuál deberías declarar el array @contenido antes de poder utilizarlo como variable.

Espero que sea eso. Si sigue dándote el error, adjunta el código completo en un mensaje e intentaré ayudarte.

Salu2,
Avalon

cedosd

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Fich. Unix con Perl
« Respuesta #7 en: Lunes 7 de Octubre de 2002, 11:08 »
0
Efectivamente, estaba usando use strict, lo he quitado y me sigue pasando  lo mismo (si es que soy un novato!!!)
A ver si tu puedes:

#!/usr/bin/perl  -w
use CGI;

my $q   = new CGI;
my $rtr = $q->param ( "rtr" );
my $calle = $q->param ( "calle" );
my $mac = $q->param ( "mac" );
my $ip = $q->param ( "ip" );

print $q->header( "text/plain" );

# abres el fichero
open INPUT, "/home/oper/noc/fichero.txt");

# guardas todo el contenido del fichero en una variable
my @contenido = <INPUT>;

# cierras el fichero
close(INPUT);

# recorres los datos del fichero
foreach $linea (@contenido) {

   chop($linea);

   # se busca la lmnea que contiene el texto que nos interesa
   if ($linea =~ /b$rtr/i)
        {
      push(@nuevosdatos, $linea . "n");

      # Si se ha encontrado el texto, aqum aqadirmas las lmneas que quieres
 insertar
      push(@nuevosdatos, "}n");
      push(@nuevosdatos, "# C/ $calle n");
      push(@nuevosdatos, "  host ALO_00{ n");
      push(@nuevosdatos, "  hardware ethernet  $mac; n");
      push(@nuevosdatos, "  fixed_address $ip; n");
        }

   else {
      # se deja la lmnea como estaba
      push(@nuevosdatos, $linea . "n");
   }
}

# Ahora vuelcas los nuevos datos en el fichero, borrando los datos que cont
enma anter
#iormente

open(OUTPUT, "+< fichero.txt");

foreach $linea (@nuevosdatos) {
   print OUTPUT $linea;
}

close(OUTPUT);



Gracias de antemano, Avalon!!

Avalon

  • Miembro MUY activo
  • ***
  • Mensajes: 449
    • Ver Perfil
Fich. Unix con Perl
« Respuesta #8 en: Lunes 7 de Octubre de 2002, 13:10 »
0
Hola de nuevo.

La verdad es que no sabría decirte donde puede estar el problema. He estado probando el código y me funciona bién, salvo un error que es debido a un paréntesis que falta en esta línea:

# abres el fichero
open (INPUT, "/home/oper/noc/fichero.txt");

No se si el paréntesis se habrá perdido cuando has copiado el código, pero como esa línea está justo encima de la que te da el error, quizá podría estar ahí el asunto, no lo sé.

Siento no poder ser más preciso.

Salu2 y buena suerte,
Avalon