2012-05-03 7 views
13

que estoy usando Perl para buscar y reemplazar múltiples expresiones regulares: Cuando ejecuto el comando siguiente, me sale un error:Perl búsqueda de línea de comandos y reemplazar con expresiones múltiples

prompt> find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g' -pe 's/(\W)##/\1/g' 
syntax error at -e line 2, near "s/(\W)##/\1/g" 
Execution of -e aborted due to compilation errors. 
xargs: perl: exited with status 255; aborting 

que tienen múltiples -e es válido en Perl, ¿por qué no funciona? ¿Hay una solución para esto?

+0

Puede reemplazar esas dos expresiones regulares con una alternancia: 's/## (? = \ W) | (? <= \ W) ## // g' – TLP

+0

@TLP Soy un novato en Perl; por favor, ¿pueden explicar qué significan? = y? <= este contexto? –

+0

Son aserciones alternativas, puede leer más sobre ellas en [perldoc perlre] (http://perldoc.perl.org/perlre.html#Look-Around-Assertions). Tienen ancho cero, por lo que solo revisan y no eliminan. – TLP

Respuesta

29

Varios -e están permitidos.

Te faltan las declaraciones de Perl ';'

find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g;' -pe 's/(\W)##/\1/g;' 

tiene que terminar con ;. La instrucción final en un bloque no necesita un punto y coma de terminación. Así que solo -e sin ; funcionará, pero tendrá que agregar ; cuando tenga múltiples -e declaraciones.

+0

Muchas gracias por su respuesta. Estaba en mi ingenio al tratar de resolver esto. –

+5

O 'xargs perl -i -pe 's/## (\ W)/\ 1/g; s/(\ W) ##/\ 1/g; '' –

Cuestiones relacionadas