2009-11-08 16 views
5

estoy tratando de convertir de la siguiente manera:¿Cómo puedo hacer una sustitución condicional en Perl?

bool foo(int a, unsigned short b) 
{ 
    return pImpl->foo(int a, unsigned short b); 
} 

a:

bool foo(int a, unsigned short b) 
{ 
    return pImpl->foo(a, b); 
} 

En otras palabras, lo que necesito para eliminar la definición de tipo en las líneas que no son la definición de función.

Estoy usando Linux.

El siguiente quita el tipo en ambas líneas:

perl -p -e 's/(?<=[,(])\s*?(\w+)*.*?(\w*)(?=[,)])/ $2/g;' fileName.cpp 

¿Cómo puedo reemplazar sólo en la línea que comienza con 'retorno' y aún así realizar varios cambios en la misma línea?

Respuesta

8

Añadir un if declaración:

perl -p -e 's/regex/replacement/g if /^\s*return/;' fileName.cpp 

Como alternativa, puede utilizar la cadena que se pasa a perl -p es un cuerpo de un bucle:

perl -p -e 'next unless /^\s*return/; s/add/replacement/g;' filename.cpp 
+0

ah - ¡por supuesto! Gracias. – user204884

+2

Es bueno ver las advertencias, incluso en los vendedores de líneas, así que añada un -w (o un paquete como -pe). – ysth

0

Puede poner algo que coincida -> en su expresión regular para que no coincida con la definición de la función. Aún mejor sería escribir un script que analice línea por línea y rechace líneas sin un -> incluso antes de hacer la sustitución.

+0

No sería que luego tienen que recordar todos los campos para la recomposición en el reemplazo? – user204884

+0

¿Es difícil hacer eso? –

+0

La cantidad de parámetros en la función puede variar, por supuesto, – user204884

Cuestiones relacionadas