Tengo un archivo con la siguiente sintaxis en some_1.xyz

module some_1 {
INPUT PINS
OUTPUT PINS
}

y quiero insertar APLICAR los RETRASOS xx y APLICAR CARGAS ld después de módulo de línea some_1 {

El siguiente código funciona bien para un solo archivo decir, si puedo reemplazar some_1.xyz *.xyz, a continuación, la secuencia de comandos no funciona. He intentado introducir sueño(xx), pero el código no funciona para varios archivos y no pude averiguar por qué no funciona. Los punteros se agradece. Gracias

@modulename_array = `grep "module " some_1.xyz | cut -f 2 -d ' '`;
@line = `grep "module " some_1.xyz`;

chomp(@line);
chomp(@kfarray);

$i = 0;
foreach (@modulename_array) {
  print "Applying delay and load to $_.xyz $line[$i] \n";

  `perl -ni -le 'print; print "\tAPPLY DELAY xx \n \tAPPLY LOADS  ld\n" if/$line[$i]/' $_.xyz`;
  $i++;
  #sleep(3);

}
  • Tengo alrededor de 1500 dichos archivos en el que estas líneas adicionales tienen que ser incrustado. y estoy usando perl 5.8.8 en Linux.
  • sólo para señalar si los archivos que estamos analizando son perl usted podría utilizar PPI, pero que no se parezca a perl
InformationsquelleAutor rahul | 2010-08-06

5 Comentarios

  1. 3

    Y lo que está mal con la solución fácil?:

    $data=`cat /the/input/file`;
    $data=~s/some_1 {\n/some_1 {\nAPPLY DELAYS xx\nAPPLY LOADS ld\n/gm;
    print $data;
  2. 4

    Algo mucho más simple, en una sola línea usando SED (en el caso de esta pregunta es sólo para UNIX y cuando el partido es un valor fijo, no es una expresión regular):

    sed -i -e "s/<match pattern>/<match pattern>\n<new line here>/g" file.txt

    (Las opciones que se han intercambiado en comparación con la respuesta inicial, porque el primer comentario.)

    Aviso de la \n es añadir una nueva línea. Se refiere a

    • sed -i -e ... funciona para mí, pero sed -e -i ... da un error: sed: -e expression #1, char 1: unknown command: - estoy usando GNU sed versión 4.2.1. Supongo que el script se debe directamente de la siguiente manera el -e arg.
    • Termino con una n personaje, no una nueva línea. el hombre de la página dice: «La secuencia de escape \n coincide con un carácter de nueva línea incrustado en el espacio en el patrón. Usted no puede, sin embargo, el uso literal de un carácter de nueva línea en una dirección o en el comando sustituir.» (Esto es en OS X)
  3. 0

    Tengo ni idea de por qué el código no funciona, pero tengo problemas en el seguimiento de su uso de Perl dentro de comillas simples inclinadas dentro de Perl. Esto no está probado, pero debería funcionar. Sugiero que usted también «use strict»; y que «el uso de advertencias;».

    my @files = ("some_1.xyz", "some_2.xyz", ... );
    for my $file in ( @files )
    {
        my $outfile = $file + ".tmp";
        open( my $ins, "<", $file ) or die("can't open " . $file . " for reading: " . $!);
        open( my $outs, ">", $outfile ) 
            or die("can't open " . $outfile . " for writing: " . $!);
        while ( my $line = <$ins> )
        {
            print { $outs } $line;
            if ( $line =~ m/^module\s+/ )
            {
                 print { $outs } "\tAPPLY DELAY xx\n\tAPPLY LOADS ld\n";
            }
        }
        rename( $outfile, $file );
    }
    • use warnings y use strict faltan, /module / -> /^module\s+/, die("...") -> die "can't open $filenane: $?" y sería sobre el derecho, teniendo en cuenta que no OS/plataforma fue mencionado en la pregunta. PS línea con my $outfile = ... falta el punto y coma.
    • PS la línea abierta($outfile) falta el punto y coma
    • El abierto outfile línea tiene un punto y coma, es sólo en la línea siguiente.
  4. 0
    $text='bla bla mytext bla bla';
    $find='.*mytext.*';
    $repl='replacement';
    
    $text=~ s/($find)/$1$repl/g;

    $1 es básicamente de su partido y no se puede utilizar al hacer el reemplazo, ya sea antes o después de su $repl cadena. )))

    FÁCIL

  5. 0

    one-liner

    perl -pi -e '/module some_1/and $_.="APPLY DELAY xx \nAPPLY LOADS  ld\n"' files*.txt

Dejar respuesta

Please enter your comment!
Please enter your name here