• Publicidad

Copiar bloques de texto en archivos separados

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Copiar bloques de texto en archivos separados

Notapor pablgonz » 2014-02-16 13:31 @605

Hola a todos, vuelvo al foro con el siguiente problema. Trataré de explicarme de la forma más clara posible.

Dispongo de varios archivos de la siguiente forma:
Sintáxis: (test.tex) [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{pstricks}
  3. \tcbuselibrary{listings,
  4.                           breakable,
  5.                         skins}
  6. \begin{document}
  7. Este texto va acá
  8. \begin{MYexample}[justification=\centering,pos=r,
  9.                                         rframe={},hsep=1cm,varwidth=true]
  10. Bloque 1 que deseo extraer, acá van cosas como
  11. \def alguna cosa
  12. \psset{unit=0.5cm,
  13.                 runit=0.5cm
  14.                 }
  15. \begin{pspicture}[showgrid=true](0,3)(10,10)
  16. \psdot(2,4)\pscircle(7,7){2}
  17. % otras cosas
  18. \psCircleTangents(2,4)(7,7){2}
  19. \pcline[nodesep=-1cm,linecolor=blue](2,4)(CircleT1)
  20.  
  21. \end{postscript}
  22. \end{MYexample}
  23.  
  24. Acá va más texto
  25.  
  26. \begin{MYexample}[pos=r]
  27. Bloque 2 que deseo extraer, acá van cosas como
  28. \def alguna cosa
  29. \begin{pspicture}[showgrid=true](0,3)(10,10)
  30. \psdot(2,4)\pscircle(7,7){2}
  31. \psCircleTangents(2,4)(7,7){2}
  32. \end{MYexample}
  33.  
  34. Acá va más texto
  35.  
  36. \begin{MYexample}
  37. Bloque 3 que deseo extraer, acá van cosas como
  38.  
  39. \begin{pspicture}[showgrid=true](0,3)(10,10)
  40.  
  41. \psdot(2,4)\pscircle(7,7){2}
  42. \end{pspicture}
  43. \end{MYexample}
  44.  
  45. \end{document}
  46.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Deseo copiar todo lo que esté entre
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \begin{MYexample}[...]
  2. ...
  3. \end{MYexample}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
(con y sin []) sin incluir sin las líneas \begin{MYexample}[...] y \end{MYexample}[...] en archivos separados de esta forma:
Sintáxis: (test-src-número.tex) [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{pstricks}
  3. \tcbuselibrary{listings,
  4.                           breakable,
  5.                         skins}
  6. \begin{document}
  7. \thispagestyle{empty}
  8. Bloque 1 que deseo extraer, acá van cosas como
  9. \def alguna cosa
  10. \psset{unit=0.5cm,
  11.                 runit=0.5cm
  12.                 }
  13. \begin{pspicture}[showgrid=true](0,3)(10,10)
  14. \psdot(2,4)\pscircle(7,7){2}
  15. % otras cosas
  16. \psCircleTangents(2,4)(7,7){2}
  17. \pcline[nodesep=-1cm,linecolor=blue](2,4)(CircleT1)
  18.  
  19. \end{postscript}
  20. \end{document}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

dentro del directorio (images) y modificar el fichero de entrada a:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{pstricks}
  3. \tcbuselibrary{listings,
  4.                           breakable,
  5.                         skins}
  6. \begin{document}
  7. Este texto va acá
  8. \begin{MYexample}[justification=\centering,pos=r,
  9.                                         rframe={},hsep=1cm,varwidth=true,graphic={[scale=1]images/test-src-1}]
  10. Bloque 1 que deseo extraer, acá van cosas como
  11. \def alguna cosa
  12. \psset{unit=0.5cm,
  13.                 runit=0.5cm
  14.                 }
  15. \begin{pspicture}[showgrid=true](0,3)(10,10)
  16. \psdot(2,4)\pscircle(7,7){2}
  17. % otras cosas
  18. \psCircleTangents(2,4)(7,7){2}
  19. \pcline[nodesep=-1cm,linecolor=blue](2,4)(CircleT1)
  20.  
  21. \end{postscript}
  22. \end{MYexample}
  23.  
  24. Acá va más texto
  25.  
  26. \begin{MYexample}[pos=r,graphic={[scale=1]images/test-src-2}]
  27. Bloque 2 que deseo extraer, acá van cosas como
  28. \def alguna cosa
  29. \begin{pspicture}[showgrid=true](0,3)(10,10)
  30. \psdot(2,4)\pscircle(7,7){2}
  31. \psCircleTangents(2,4)(7,7){2}
  32. \end{MYexample}
  33.  
  34. Acá va más texto
  35.  
  36. \begin{MYexample}[graphic={[scale=1]images/test-src-3}]
  37. Bloque 3 que deseo extraer, acá van cosas como
  38.  
  39. \begin{pspicture}[showgrid=true](0,3)(10,10)
  40.  
  41. \psdot(2,4)\pscircle(7,7){2}
  42. \end{pspicture}
  43. \end{MYexample}
  44.  
  45. \end{document}
  46.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es decir, para los archivos separados:
  • Copio lo que está desde el inicio hasta \begin{document}
  • Agrego la línea \thispagestyle{empty}
  • Agrego el bloque de texto que deseo
  • Agrego la línea \end{document}
y los guardo dentro del directorio con los nombres test-src-1.tex, test-src-2.tex, ...

y en el archivo de entrada agrego la línea graphic={[scale=1]images/test-src-...} dentro del [...] de \begin{MYexample}[...] con una coma después si está presente el corchete y, si el corchete no está presente lo creo y agrego la línea sin la coma.

Hasta aquí la explicación del problema; ahora, la parte de la solución que tengo en mente. Dispongo del siguiente script:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use File::Basename;                       # separa el archivo de entrada
  4. use Getopt::Long;                         # para añadir las opciones
  5. use autodie;                              # muere si no es correcto
  6. my $imageDir = "images";                  # directorio de imágenes (images por defecto)
  7.  
  8. @ARGV == 0 && die "Ingresa un archivo!\n";
  9.  
  10. my @SuffixList = (".tex","",".ltx");                    # posible extensión
  11. my ($name,$path,$ext) = fileparse($ARGV[0],@SuffixList);
  12. if ( $ext eq "" ) { $ext = ".tex"; }                    # fijamos la extensión
  13. my $TeXfile = "$path$name$ext";
  14.  
  15. ## Creamos el directorio si éste no existe
  16. if (! -e $imageDir) {
  17.  mkdir($imageDir,0744) or die "No puedo crear $imageDir";
  18. }
  19.  
  20. ## Lectura del archivo
  21. open my $ENTRADA, '<', "$name.tex";
  22. my $archivo;
  23. {
  24.     local $/;
  25.     $archivo = <$ENTRADA>;
  26. }
  27. close   $ENTRADA;
  28.  
  29. ## Partición del documento
  30.  
  31. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
  32.  
  33. ##  
  34.  
  35. ## Grabar
  36. open my $SALIDA, '>', "$name-tmp.tex";
  37. print $SALIDA $archivo;
  38. close $SALIDA;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Con este creo el directorio y divido el documento como yo lo deseo
  • $cabeza contiene desde el inicio hasta \begin{document}
  • $cuerpo contiene el texto sobre el cual deseo buscar
  • $final contiene la linea \begin{document}
Mi idea es poder añadir algo así dentro del script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $id      = 1; # contador para los archivos-src
  2. my $destino = "$imageDir/$name-src-$id.tex";
  3.  
  4. while () {
  5.     if ($archivo =~ /\begin{MYexample}[...] ... \end{MYexample}/) {  # buscamos el bloque
  6.         $id++; # Iniciamos el contador
  7.     # Creamos los ficheros y copiamos lo que deseamos
  8.         print "$cabeza\n";
  9.         print "\\thispagestyle\{empty\}\";
  10.         print LO QUE DESEO;
  11.         print $final;
  12.    }
  13. }
  14.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Espero haberme explicado de forma clara.
Saludos,
Pablo
Última edición por pablgonz el 2014-02-18 21:30 @937, editado 2 veces en total
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Copiar bloques de texto en archivos separados

Notapor pablgonz » 2014-02-18 19:28 @853

Traté de buscar la solución por otro camino (no es el que deseaba, pero, me servirá en el futuro). Como me compliqué bastante tratando de sacar los archivos por separado, mejor creo uno nuevo y en el pego todos los bloques que me interesan separados por la palabra \newpage y luego, con una expresión regular modifico el archivo de entrada a lo que deseo, algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use File::Basename;                       # separa el archivo de entrada
  4. use Getopt::Long;                         # para añadir las opciones
  5. use autodie;                              # muere si no es correcto
  6. my $imageDir = "images";                  # directorio de imágenes (images por defecto)
  7. my $Iscale = 1;                           # para \includegraphics
  8. @ARGV == 0 && die "Ingresa un archivo!\n";
  9.  
  10. my @SuffixList = (".tex","",".ltx");                    # posible extensión
  11. my ($name,$path,$ext) = fileparse($ARGV[0],@SuffixList);
  12. if ( $ext eq "" ) { $ext = ".tex"; }                    # fijamos la extensión
  13. my $TeXfile = "$path$name$ext";
  14.  
  15. ## Creamos el directorio si éste no existe
  16. if (! -e $imageDir) {
  17.  mkdir($imageDir,0744) or die "No puedo crear $imageDir";
  18. }
  19.  
  20. open my $ENTRADA, '<', "$name.tex";
  21. open my $SALIDA, '>', "$imageDir/$name-src.tex";
  22.  
  23. my $estamos_en = 'la_cabecera';
  24.  
  25. while (<$ENTRADA>) {
  26.     if ($estamos_en eq 'la_cabecera') {
  27.         if (/^\\begin\{document\}/) {
  28.             $estamos_en = 'documento';
  29.             print $SALIDA "\\pagestyle{empty}\n";
  30.             print $SALIDA $_;
  31.         }
  32.     }
  33.    
  34.     if (/^\\begin\{(?:MYexample)\}/) {
  35.         if ($estamos_en eq 'fin_rango') {
  36.             print $SALIDA "\\newpage\n";
  37.         }
  38.         $estamos_en = 'rango';
  39.     }
  40.  
  41.     if (/^\\end\{(?:MYexample)\}/) {
  42.         $estamos_en = 'fin_rango';
  43.         print $SALIDA $_;
  44.     }
  45.  
  46.     if ($estamos_en eq 'la_cabecera'
  47.      or $estamos_en eq 'rango'
  48.     ) {
  49.         print $SALIDA $_;
  50.        }
  51. }
  52. print $SALIDA "\\end{document}\n";
  53. close $SALIDA;
  54. close $ENTRADA;
  55.  
  56. # Abrimos y eliminamos las líneas no deseadas
  57. open my $ENTRADA, '<', "$imageDir/$name-src.tex";
  58. my $archivo;
  59. {
  60.     local $/;
  61.     $archivo = <$ENTRADA>;
  62. }
  63. close   $ENTRADA;
  64.  
  65. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
  66. $cuerpo =~
  67. s/(?<inicio>\\begin{MYexample})(?:\[):?(?<opciones>.+?):?(?:\]):?(?<code>.+?)(?<end>\\end{MYexample})/$+{code}/gemxs;
  68.  
  69. ## Guardamos en el mismo archivo
  70. open my $SALIDA, '>', "$imageDir/$name-src.tex";
  71. print $SALIDA "$cabeza\n$cuerpo\n$final";
  72. close $SALIDA;
  73. # Abrimos el archivo de entrada y generamos los cambios
  74. open my $ENTRADA, '<', "$name.tex";
  75. my $archivo;
  76. {
  77.     local $/;
  78.     $archivo = <$ENTRADA>;
  79. }
  80. close   $ENTRADA;
  81.  
  82. ## Partición del documento
  83.  
  84. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
  85.  
  86. my $id = 1; # contador para name-src
  87.  
  88. #
  89. $cuerpo =~
  90. s/(?<inicio>\\begin{MYexample})(?:\[):?(?<opciones>.+?):?(?:\]):?(?<code>.+?)(?<end>\\end{MYexample})
  91. /qq($+{inicio}\[\\graphic=\{\[scale=1\]$imageDir\/$name-src-$id.tex}). ($+{opciones} ? "," : "").qq($+{opciones}\]$+{code}$+{end})/gemxs;
  92. $id =$id+1;
  93.  
  94. ##  
  95.  
  96. ## Grabar
  97. open my $SALIDA, '>', "$name-tmp.tex";
  98. print $SALIDA "$cabeza\n$cuerpo\n$final";
  99. close $SALIDA;
  100.  
  101. __END__
  102.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Claro que esta propuesta no funciona del todo bien, se me presentan tres problemas:
  • Tendría que abrir el archivo que generé y quitar las líneas \begin{MYexample}[...] y \end{MYexample} (esta expresión regular es la que me esta dando dolor de cabeza).
  • La expresión regular que estoy utilizando falla cuando la entrada es del tipo:
    Sintáxis: [ Descargar ] [ Ocultar ]
    Using latex Syntax Highlighting
    1. \begin{MYexample}[
    2.                  pos=r,
    3.                  rframe={},
    4.                  hsep=1cm
    5.                 ]                                                                      
    6. Bloque 1 que deseo extraer, acá van cosas como
    7. \end{MYexample}
    Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
    me agrega un ] que no necesito
  • El contador que defino está fijo (en 1) en vez de ir 1,2,3,..

Con el siguiente código logro crear los archivos por separado, pero, nuevamente tengo problemas con las nuevas líneas
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open my $ENTRADA, '<', "$name.tex";
  2. while (<$ENTRADA>) {
  3.         my ( $inicio, $end );
  4.         if ( index($_,"\\begin{MYexample}") != -1 ) {
  5.         $inicio = 1;
  6. }
  7. elsif ( index($_,"\\end{MYexample}") != -1 ) {
  8.         $end = 1;
  9. }
  10.  
  11. if ( $inicio .. $end ) {
  12.         state $id //= 1;
  13.         state $sub_src = sub {
  14.         state $fh;
  15.         return $fh if defined $fh;
  16.         open ( $fh, '>', "$name-src-$id.tex" ) or die $!;
  17.         $fh;
  18. };
  19.  
  20. if ( $inicio ) {}
  21. elsif ( $end ) {
  22.         $id++;
  23.         $sub_src = sub {
  24.         state $fh;
  25.         return $fh if defined $fh;
  26.         open ( $fh, '>', "$imageDir$/$name-src-$id.tex" ) or die $!;
  27.         $fh;
  28.   };
  29. }
  30. else {
  31.   my $fh = $sub_src->();
  32.   print $fh $_;
  33.                 }
  34.         }
  35. }
  36. close $ENTRADA;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero falla si dentro del [...] de \begin{MYexample} van saltos de línea , por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \begin{MYexample}[
  2.                  pos=r,
  3.                  rframe={},
  4.                  hsep=1cm
  5.                 ]                                                                      
  6. Bloque 1 que deseo extraer, acá van cosas como
  7. \end{MYexample}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

El ideal sería dejar los archivos separados, pero, si logro dar con la expresión regular adecuada y puedo hacer funcionar el contador, soluciono mi problema.
Saludos,
Pablo
P.D.: Busco la idea de los archivos separados, porque se cómo unirlos después en caso de que los necesite todo en uno.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Copiar bloques de texto en archivos separados

Notapor pablgonz » 2014-02-20 14:24 @641

Bueno, no pude lograr lo que deseaba y tuve que ocupar la segunda opción, copiar todo en un nuevo archivo eliminando lo que no deseo, no es el ideal, pero, hasta que pueda dar con mi duda inicial, me conformo, quedo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use File::Basename;                       # separa el archivo de entrada
  4. use Getopt::Long;                         # para añadir las opciones
  5. use autodie;                              # muere si no es correcto
  6. my $imageDir = "images";                  # directorio de imágenes (images por defecto)
  7. my $Iscale = 1;                           # para \includegraphics
  8. @ARGV == 0 && die "Ingresa un archivo!\n";
  9.  
  10. my @SuffixList = (".tex","",".ltx");                    # posible extensión
  11. my ($name,$path,$ext) = fileparse($ARGV[0],@SuffixList);
  12. if ( $ext eq "" ) { $ext = ".tex"; }                    # fijamos la extensión
  13. my $TeXfile = "$path$name$ext";
  14.  
  15. ## Creamos el directorio si éste no existe
  16. if (! -e $imageDir) {
  17.  mkdir($imageDir,0744) or die "No puedo crear $imageDir";
  18. }
  19.  
  20. open my $ENTRADA, '<', "$name.tex";
  21. open my $SALIDA, '>', "$imageDir/$name-src.tex";
  22.  
  23. my $estamos_en = 'la_cabecera';
  24.  
  25. while (<$ENTRADA>) {
  26.     if ($estamos_en eq 'la_cabecera') {
  27.         if (/^\\begin\{document\}/) {
  28.             $estamos_en = 'documento';
  29.             print $SALIDA "\\pagestyle{empty}\n";
  30.             print $SALIDA $_;
  31.         }
  32.     }
  33.    
  34.     if (/^\\begin\{(?:MYexample)\}/) {
  35.         if ($estamos_en eq 'fin_rango') {
  36.             print $SALIDA "\\newpage\n";
  37.         }
  38.         $estamos_en = 'rango';
  39.     }
  40.  
  41.     if (/^\\end\{(?:MYexample)\}/) {
  42.         $estamos_en = 'fin_rango';
  43.         print $SALIDA $_;
  44.     }
  45.  
  46.     if ($estamos_en eq 'la_cabecera'
  47.      or $estamos_en eq 'rango'
  48.     ) {
  49.         print $SALIDA $_;
  50.        }
  51. }
  52. print $SALIDA "\\end{document}\n";
  53. close $SALIDA;
  54. close $ENTRADA;
  55.  
  56. # Abrimos y eliminamos las lineas no deseadas
  57. open my $ENTRADA, '<', "$imageDir/$name-src.tex";
  58. my $archivo;
  59. {
  60.     local $/;
  61.     $archivo = <$ENTRADA>;
  62. }
  63. close   $ENTRADA;
  64.  
  65. ## Partición del documento
  66. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
  67.  
  68. $cuerpo =~
  69. s/(?<inicio>\\begin{MYexample})(?:\[):?(?<opciones>.+?):?(?:\]):?(?<code>.+?)(?<end>\\end{MYexample})/$+{code}/gemxs;
  70.  
  71. ## Guardamos en el mismo archivo
  72. open my $SALIDA, '>', "$imageDir/$name-src.tex";
  73. print $SALIDA "$cabeza\n$cuerpo\n$final";
  74. close $SALIDA;
  75.  
  76.  
  77. # Abrimos y hacemos los cambios en la entrada
  78. open my $ENTRADA, '<', "$name.tex";
  79. my $archivo;
  80. {
  81.     local $/;
  82.     $archivo = <$ENTRADA>;
  83. }
  84. close   $ENTRADA;
  85.  
  86. ## Partición del documento
  87.  
  88. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
  89.  
  90. my $id = 1; # contador para name-src
  91. #
  92. $cuerpo =~
  93. s/(?<inicio>\\begin{MYexample})(?:\[):?(?<opciones>.+?):?(?:\]):?(?<code>.+?)(?<end>\\end{MYexample})
  94. /$+{inicio}.qq(\[\\graphic=\{\[scale=1\]$imageDir\/$name-src-).$id++.qq(.tex}). ($+{opciones} ? "," : "").qq($+{opciones}\]$+{code}$+{end})/gemxs;
  95.  
  96. ## Grabar
  97. open my $SALIDA, '>', "$name-tmp.tex";
  98. print $SALIDA "$cabeza\n$cuerpo\n$final";
  99. close $SALIDA;
  100.  
  101. __END__
  102.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Falla si el texto que deseo extraer no lleva [...], es decir:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \begin{MYexample}
  2. Bloque que deseo extraer...
  3. \end{MYexample}
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

pero, este caso no se me presenta muy a menudo. Creo que estoy dando un par de vueltas extra y la expresión regular (92-94) no está del todo correcta, pero, funciona.

Seguiré intentando extraerlos en ficheros, aunque, no sé si index es la función indicada para esto.
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Copiar bloques de texto en archivos separados

Notapor pablgonz » 2014-02-24 08:05 @378

No logré resolver mi problema inicial... hice varios intentos, pero, no doy con la solución... ¿Alguien tendrá alguna idea de cómo solucionarlo?

Saludos,
Pablo.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Copiar bloques de texto en archivos separados

Notapor pablgonz » 2014-03-06 17:52 @786

Ahora sí estoy atascado, creí que sería capaz de resolverlo por mi cuenta pero no pude copiar los bloques de texto en archivos separados. Revisé respuestas a preguntas similares en http://stackoverflow.com y http://www.perlmonks.org pero, no se ajusta a lo que busco (procesan el archivo por líneas). ¿Es posible hacerlo usando Perl...?

Saludos,
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Copiar bloques de texto en archivos separados

Notapor explorer » 2014-03-07 17:55 @788

He encontrado una solución:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;                                            # muere si ocurre un error
  4. use File::Basename;                                     # separa el archivo de entrada
  5. use File::Slurp;                                        # para leer el archivo
  6.  
  7. ### Constantes --------------------------------------------------------------
  8. my $imageDir = 'images/';                               # directorio de imágenes
  9. my $graphics = 'graphic={[scale=1]images/test-src';
  10.  
  11. ### Argumentos --------------------------------------------------------------
  12. @ARGV == 1  or die "Uso: $0 <archivo TeX a procesar>\n";
  13. my $nombre_archivo = shift;
  14. -f $nombre_archivo or die "ERROR: No encuentro [$nombre_archivo]\n";
  15.  
  16.  
  17. ### Directorio destino ------------------------------------------------------
  18. -e $imageDir or mkdir($imageDir,0744) or die "No puedo crear $imageDir: $!\n";
  19.  
  20.  
  21. ### Arreglo de la extensión -------------------------------------------------
  22. my @SuffixList = ('.tex', '', '.ltx');                  # posible extensión
  23. my ($name, $path, $ext) = fileparse($nombre_archivo, @SuffixList);
  24. $ext = '.tex' if not $ext;                              # fijamos la extensión
  25. my $nuevo_nombre_archivo = "$path$name-nuevo$ext";
  26.  
  27.  
  28. ### Proceso 1 : Ajustamos el archivo original -------------------------------
  29. my $archivo = read_file($nombre_archivo);
  30.  
  31. my $contador = 1;
  32.  
  33. # Poner el atributo añadido a \begin{MYexample}
  34. while ($archivo =~ /^\\begin\{MYexample\}(\[.+?\])?/gsm) {
  35.  
  36.     my $corchetes = $1;
  37.     my($pos_inicial, $pos_final) = ($-[1], $+[1]);      # posición donde están los corchetes
  38.  
  39.     if (not $corchetes) {
  40.         $pos_inicial = $pos_final = $+[0];              # si no hay corchetes, nos ponemos al final de \begin
  41.     }
  42.  
  43.     if (not $corchetes  or  $corchetes =~ /\[\s*\]/) {  # si no hay corchetes, o están vacíos,
  44.         $corchetes = "[$graphics-$contador}]";          # ponemos los nuestros
  45.     }
  46.     else {                                              # si sí hay corchetes,
  47.         $corchetes =~ s/\]/,$graphics-$contador}]/;     # lo agregamos al final, dentro de los corchetes
  48.     }
  49.  
  50.     substr($archivo, $pos_inicial, $pos_final - $pos_inicial) = $corchetes;    
  51.     pos($archivo) = $pos_inicial + length $corchetes;   # reposicionamos la búsqueda de la exp. reg.
  52. }
  53. continue {
  54.     $contador++;
  55. }
  56.  
  57. open my $SALIDA, '>', $nuevo_nombre_archivo;
  58. print $SALIDA $archivo;
  59. close $SALIDA;
  60.  
  61. ### Proceso 2 : Extraer los archivos secundarios ----------------------------
  62. while ($archivo =~ /^\\begin\{MYexample\}\[.+?(?<nombre_archivo_secundario>images\/.+?-\d+)\}\](?<contenido>.+?)(?=^\\end\{MYexample})/gsm) {
  63.  
  64.     open my $SALIDA, '>', "$+{'nombre_archivo_secundario'}.tex";
  65.  
  66.     print $SALIDA <<"EOC";
  67. \\documentclass{article}
  68. \\usepackage{pstricks}
  69. \\tcbuselibrary{listings,
  70. \t\t\t  breakable,
  71. \t\t\tskins}
  72. \\begin{document}
  73. \\thispagestyle{empty}$+{'contenido'}\\end{document}
  74. EOC
  75.  
  76.     close $SALIDA;
  77. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
La salidas son exactas a las que pides.

El proceso se divide en dos. En el primero, recorremos el $archivo y vamos actualizando los corchetes que acompañan al \begin{MYexample}. En el segundo, volvemos a recorrer el $archivo, identificamos las zonas interesantes, y las sacamos a archivos individuales.

El truco está en aprovechar el trabajo hecho en un proceso, para el segundo (la información siempre queda en el propio $archivo). Y en no hacerlo todo a la vez.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Copiar bloques de texto en archivos separados

Notapor pablgonz » 2014-03-13 21:36 @942

Muchas gracias, explorer, solo modifiqué algunas líneas, cambiándolo a esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;                                            # muere si ocurre un error
  4. use File::Basename;                                     # separa el archivo de entrada
  5.  
  6. ### Constantes --------------------------------------------------------------
  7. my $imageDir = 'images/';                               # directorio de imágenes
  8. my $graphics = 'graphic={[scale=1]images/test-src';
  9.  
  10. ### Argumentos --------------------------------------------------------------
  11. @ARGV == 1  or die "Uso: $0 <archivo TeX a procesar>\n";
  12. my $nombre_archivo = shift;
  13. -f $nombre_archivo or die "ERROR: No encuentro [$nombre_archivo]\n";
  14.  
  15. ### Directorio destino ------------------------------------------------------
  16. -e $imageDir or mkdir($imageDir,0744) or die "No puedo crear $imageDir: $!\n";
  17.  
  18. ### Arreglo de la extensión -------------------------------------------------
  19. my @SuffixList = ('.tex', '', '.ltx');                  # posible extensión
  20. my ($name, $path, $ext) = fileparse($nombre_archivo, @SuffixList);
  21. $ext = '.tex' if not $ext;                              # fijamos la extensión
  22. my $nuevo_nombre_archivo = "$path$name-nuevo$ext";
  23.  
  24. ### Proceso 1 : Ajustamos el archivo original -------------------------------
  25. open my $ENTRADA, '<', $nombre_archivo;
  26. my $archivo;
  27. {
  28.     local $/;
  29.     $archivo = <$ENTRADA>;
  30. }
  31. close   $ENTRADA;
  32.  
  33. my $contador = 1;
  34. # Dividimos
  35. my($cabeza,$cuerpo,$final) = $archivo =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
  36. # Poner el atributo añadido a \begin{MYexample}
  37. while ($cuerpo =~ /^\\begin\{MYexample\}(\[.+?\])?/gsm) {
  38.  
  39.     my $corchetes = $1;
  40.     my($pos_inicial, $pos_final) = ($-[1], $+[1]);      # posición donde están los corchetes
  41.  
  42.     if (not $corchetes) {
  43.         $pos_inicial = $pos_final = $+[0];              # si no hay corchetes, nos ponemos al final de \begin
  44.     }
  45.  
  46.     if (not $corchetes  or  $corchetes =~ /\[\s*\]/) {  # si no hay corchetes, o están vacíos,
  47.         $corchetes = "[$graphics-$contador}]";          # ponemos los nuestros
  48.     }
  49.     else {                                              # si sí hay corchetes,
  50.         $corchetes =~ s/\]/,$graphics-$contador}]/;     # lo agregamos al final, dentro de los corchetes
  51.     }
  52.  
  53.     substr($cuerpo, $pos_inicial, $pos_final - $pos_inicial) = $corchetes;    
  54.     pos($cuerpo) = $pos_inicial + length $corchetes;    # reposicionamos la búsqueda de la exp. reg.
  55. }
  56. continue {
  57.     $contador++;
  58. }
  59.  
  60. open my $SALIDA, '>', $nuevo_nombre_archivo;
  61. print $SALIDA "$cabeza\n$cuerpo\n$final";
  62. close $SALIDA;
  63.  
  64. ### Proceso 2 : Extraer los archivos secundarios ----------------------------
  65. while ($cuerpo =~ /^\\begin\{MYexample\}\[.+?(?<nombre_archivo_secundario>images\/.+?-\d+)\}\](?<contenido>.+?)(?=^\\end\{MYexample})/gsm) {
  66.     open my $SALIDA, '>', "$+{'nombre_archivo_secundario'}.tex";
  67.     print $SALIDA <<"EOC";
  68. $cabeza\n\\thispagestyle{empty}$+{'contenido'}$final
  69. EOC
  70.     close $SALIDA;
  71. }
  72.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
La parte "cabeza" cambia de un archivo a otro, por eso hago la división, cambié lo relativo al módulo Slurp que usaste para la apertura del archivo (tengo problemas con Fedora :( y no puedo actualizar ni instalar módulos. Una duda (para variar): ¿Por qué me quita las líneas en blanco entre $cabeza y $cuerpo?, es decir, si el archivo de entrada es algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using latex Syntax Highlighting
  1. \documentclass{article}
  2. \usepackage{pstricks}
  3. \tcbuselibrary{listings,
  4.                          breakable,
  5.                        skins}
  6. \begin{document}
  7.  
  8.  
  9. Este texto va acá
  10. \begin{MYexample}[justification=\centering]
  11. Bloque 1 que deseo extraer
  12. \end{MYexample}
  13.  
  14. Acá va más texto
  15.  
  16. \begin{MYexample}[pos=r]
  17. Bloque 2 que deseo extraer
  18. \end{MYexample}
  19.  
  20. Acá va más texto
  21. \end{document}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
donde las líneas 7 y 8 están en blanco, me genera el archivo de salida sin las líneas 7 y 8 en blanco del original.
Saludos,
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Copiar bloques de texto en archivos separados

Notapor explorer » 2014-03-14 06:28 @311

Los espacios coinciden con los comodines \s*, que no estás capturando (están fuera de los paréntesis de captura). Por eso desaparecen.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Copiar bloques de texto en archivos separados

Notapor pablgonz » 2014-03-14 07:16 @344

explorer escribiste:Los espacios coinciden con los comodines \s*, que no estás capturando (están fuera de los paréntesis de captura). Por eso desaparecen.
Tienes toda la razón... luego de escribir me percaté de eso... El problema es que no doy con el lugar exacto donde debo poner paréntesis... Como las líneas en blanco son opcionales intenté con (\s*):? pero no me funcionó... ¿Cuál es el lugar correcto?

Agradecido,
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Copiar bloques de texto en archivos separados

Notapor explorer » 2014-03-14 08:22 @390

Hay que meter los comodines dentro del par de paréntesis en el que quieras guardarlos:

m/\A (.+? ^\\begin{document}) (\s* .+? \s*) (^ \\end{document}) \s* \z/msx;

De todas maneras... queda más claro si ponemos menos:

m/\A (.+? ^\\begin{document}) (.+?) (^ \\end{document})/msx;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Siguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 11 invitados

cron