Acotar expresión regular
Publicado: 2013-11-15 23:22 @015
Hola, amigos del foro, estoy trabajando en un pequeño script... y tengo algunas dudas con las expresiones regulares que estoy usando. Va así:
Tengo ficheros de entrada de las siguiente formas (LaTeX)
Quiero los siguientes cambios, cuando este dentro de \verb, verb* o despues de %
Pero, que no modifique, las lineas que están fuera de \verb,verb* o % en el documento, específicamente, que no cambie:
El script que utilizo es el siguiente:
Y Ahora viene mis consultas:
Pablo
Tengo ficheros de entrada de las siguiente formas (LaTeX)
Using latex Syntax Highlighting
- \documentclass{article}
- \usepackage{pstricks-add}
- \newenvironment{postscript}{}{}
- \begin{document}
- Los entornos pstricks se inician \verb|\pspicture(argumento) o \pspicture*(argumento)| para plain TeX
- y \verb+\begin{pspicture} o \begin{pspicture*}+ para LaTeX, antes o después de cada entorno, es necesario
- definir \verb'\psset{opciones}' por ejemplo:
- \verb+\psset{opciones}\begin{pspicture}+ o \verb-\begin{pspicture}\psset{opciones}- y para cerrar los entornos usamos
- (dependiendo) \verb*'\endpspicture' para plain TeX y \verb*#\end{pspicture} o \end{pspicture*}# para LaTeX.
- Algunas ocasiones es necesario definir un nuevo entorno para incluir nuestras definiciones dentro de el, por
- ejemplo \verb<\newenvironment{postscript}{}{}< e incluir nuestros entornos dentro de el, es decir, las lineas deben ser
- \verb|\begin{postscript} \psset{opciones} \begin{pspicture}| o \verb|\begin{postscript} \begin{pspicture} \psset{opciones}|
- pero no \verb|\psset{opciones}\begin{postscript}\begin{pspicture}| o \verb|\psset{opciones}\begin{pspicture}\begin{postscript}|
- y para cerrar el entorno usamos \verb&\end{postscript}&. Para comentar una linea puedes usar \verb|%| antes de cada linea
- por ejemplo \verb|% \pspicture*(argumento) o %\pspicture*(argumento) o %%%%\pspicture*(argumento)|. Veamos algunos ejemplos:
- %\begin{postscript}
- \begin{postscript}
- \psset{unit=1.0cm}
- \begin{pspicture}[showgrid=true](4,2)
- \psscaleboxto(8,2){foo bar baz}
- \end{pspicture}
- \end{postscript}
- \begin{pspicture*}(4,2)(8,1)
- \psset{unit=1.0cm}
- \psscaleboxto(8,2){foo bar baz}
- \end{pspicture*}
- %%% \pspicture*(4,2)(8,1) o \begin{pspicture*}(4,2)(8,1)
- \pspicture*(4,2)(8,1)
- \psset{unit=1.0cm}
- \psscaleboxto(8,2){foo bar baz}
- \endpspicture
- % se puede \endpspicture o \end{pspicture*}
- % \pspicture(4,2)(8,1) o \begin{pspicture}(4,2)(8,1)
- \pspicture(4,2)(8,1)
- \psset{unit=1.0cm}
- \psscaleboxto(8,2){foo bar baz}
- \endpspicture
- %\endpspicture o \end{pspicture}
- \end{document}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Quiero los siguientes cambios, cuando este dentro de \verb, verb* o despues de %
- pspicture por TRICKS
- pspicture* por TRICKS*
- postscript por POSTRICKS
- endpspicture por ENDTRICKS
Pero, que no modifique, las lineas que están fuera de \verb,verb* o % en el documento, específicamente, que no cambie:
- \pspicture(algo) o \endpspicture
- \pspicture*(algo) o \endpspicture
- \begin{pspicture} o \end{pspicture}
- \begin{pspicture*} o \end{pspicture*}
- \begin{postscript} o \end{postscript}
El script que utilizo es el siguiente:
Using perl Syntax Highlighting
- #!/usr/bin/perl -w
- use v5.16;
- use autodie;
- use strict;
- my $entrada = $ARGV[0]; # el fichero como primer argumento
- my $salida = 'salida.tex'; # fichero de salida
- open( AE, '<', $entrada ); # leemos el archivo Entrada
- undef $/; # modo 'slurp'
- my ( $uno, $dos ) = split( /\\begin\{document\}/, <AE>, 2 );
- close AE;
- my @coment = split /\n/, $dos;
- my @preamb;
- foreach my $line (@coment) { # modificamos las líneas
- chomp($line);
- # Apertura de entornos ps
- # Cambiamos \pspicture,\pspicture*,\begin{pspicture},\begin{postscript} por TRICKS y POSTRICKS
- $line =~ s/(\\[V|v]erb[\*]?[[:punct:]]{1}.+?)\\pspicture/$1\\TRICKS/g; # cambiamos \pstricks[*] por \TRICKS[*]
- $line =~ s/(\\[V|v]erb[\*]?[[:punct:]]{1}.+?)\\begin\{pspicture/$1\\begin\{TRICKS/g; # cambiamos
- $line =~ s/(\\[V|v]erb[\*]?[[:punct:]]{1}.+?)\\begin\{postscript\}/$1\\begin\{POSTRICKS\}/g; # cambiamos
- # Cambiamos los comentarios en TeX cuando comienzen con %
- $line =~ s/(\%.+?)\\pspicture/$1\\TRICKS/g; # cambiamos
- $line =~ s/(\%.+?)\\begin\{pspicture/$1\\begin\{TRICKS/g; # cambiamos
- $line =~ s/(\%.+?)\\begin\{postscript\}/$1\\begin\{POSTRICKS\}/g; # cambiamos
- # Cierre entornos pspicture
- $line =~ s/(\\[V|v]erb[\*]?[[:punct:]]{1}.+?)\\endpspicture/$1\\ENDTRICKS/g; # cambiamos \pstricks[*] por \TRICKS[*]
- $line =~ s/(\\[V|v]erb[\*]?[[:punct:]]{1}.+?)\\end\{pspicture/$1\\end\{TRICKS/g; # cambiamos
- $line =~ s/(\\[V|v]erb[\*]?[[:punct:]]{1}.+?)\\end\{postscript\}/$1\\end\{POSTRICKS\}/g; # cambiamos
- # Cambiamos los comentarios en TeX cuando comienzen con %
- $line =~ s/(\%.+?)\\endpspicture/$1\\ENDTRICKS/g; # cambiamos
- $line =~ s/(\%.+?)\\begin\{pspicture/$1\\begin\{TRICKS/g; # cambiamos
- $line =~ s/(\%.+?)\\begin\{postscript\}/$1\\begin\{POSTRICKS\}/g; # cambiamos
- push( @preamb, $line ); # las unimos
- }
- # Aquí tengo un problema, agrega una línea en blanco extra luego de unir los ficheros
- my $modificado = join( "\n", $uno . '\begin{document}', @preamb ); #pegamos
- open( AS, ">", $salida ); # creo el Archivo Salida
- print AS $modificado; # imprimo uno modificado
- close AS; # cierro
- exit; # terminamos
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
- La expresión regular $line =~ s/(\\[V|v]erb[\*]?[[:punct:]]{1}.+?)\\pspicture/$1\\TRICKS/g; no funciona bien, no es del todo correcta: si encuentra la expresión más de una vez solo cambia la primera (a veces), por ejemplo, con esta línea falla:Hice algunos intentos pero fallaba si se presentaba este caso:Using latex Syntax Highlighting
- texto \verb*|\pspicture(algo)| \verb*|\pspicture*(algo)|resto linea
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4puesto que cambiaba todo lo que estuviera en esa línea. Sé que las expresiones que busco tienen siempre la forma:Using latex Syntax Highlighting- texto \verb*|algo ...\pspicture(algo)...\pspicture(algo)...algo| texto \pstricks(algo)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4donde (carácter) es un único (|,+,!,",',etc) y aparece al principio, inmediatamente después de \verb o \verb* y al final de la cadena, sin repetirce dentro de ésta. Y aquí va mi primera pregunta:- \verb*(carácter)...código...\pstricks(algo) (una más veces) ...código(carácter)
- o
- \verb(carácter)...código...\pspicture(algo) (una más veces) ...código(carácter)
¿Cómo modifico la expresión para que cambie lo que quiero (las veces que aparezca) pero sólo dentro de éstos caracteres únicos?
(aclaro que el que se dé este caso es muy extraño, pero posible). - La expresión regular $line =~ s/(\%.+?)\\pspicture/$1\\TRICKS/g; falla si no va un espacio después de "%" y aparece más de una vez en la misma línea. En este caso "SÍ" deseo que cambie todas las ocurrencias en la línea que encuentre la expresión (de principio a fin) y la pregunta de rigor: ¿Cómo modifico la expresión para que cambie lo que quiero con o sin espacios de principio a fin de línea? o mejor dicho ¿están correctas esas expresiones? es decir, ¿capturan lo que yo creo... o solo es mi imaginación?
Pablo