SoloCodigo

Programación Web y Scripting => Perl => Mensaje iniciado por: cedosd en Martes 17 de Septiembre de 2002, 11:27

Título: Re: Fich. Unix con Perl
Publicado por: cedosd en Martes 17 de Septiembre de 2002, 11:27
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!!
Título: Re: Fich. Unix con Perl
Publicado por: Avalon en Jueves 19 de Septiembre de 2002, 14:03
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
Título: Re: Fich. Unix con Perl
Publicado por: cedosd en Viernes 20 de Septiembre de 2002, 12:43
Gracias, Avalon!!
El Lunes 23 te comento como ha ido el temilla.
Título: Re: Fich. Unix con Perl
Publicado por: cedosd en Martes 24 de Septiembre de 2002, 09:19
Gracias Avalon, funciona perfectamente......¡Tu si que sabes!!.
Título: Re: Fich. Unix con Perl
Publicado por: Avalon en Martes 24 de Septiembre de 2002, 21:35
No hay de que B)

Salu2,
Avalon
Título: Re: Fich. Unix con Perl
Publicado por: cedosd en Jueves 3 de Octubre de 2002, 10:47
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.
Título: Re: Fich. Unix con Perl
Publicado por: Avalon en Jueves 3 de Octubre de 2002, 11:11
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
Título: Re: Fich. Unix con Perl
Publicado por: cedosd en Lunes 7 de Octubre de 2002, 11:08
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!!
Título: Fich. Unix con Perl
Publicado por: Avalon en Lunes 7 de Octubre de 2002, 13:10
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