3 votos

Doble automáticamente el valor de los números en una cadena en varios archivos

Estoy tratando de modificar el código fuente de Java en numerosas .java archivos que contienen cadenas similar a este:

private static final Height biomeHeight = new Height(0.1F, 0.2F);

Hay más de 75 y me gustaría encontrar una manera de automatizar la duplicación de la 0.1 F y 0,2 valores de F en varias cadenas. Tenga en cuenta que el 0.1 F y 0,2 valores de F son diferentes en cada archivo.

Por ejemplo, en un archivo, la cadena puede ser esta:

private static final Height biomeHeight = new Height(0.2F, 0.1F);

En cuyo caso, me gustaría que fuera:

private static final Height biomeHeight = new Height(0.4F, 0.2F);

¿Cómo puedo automatizar esto?

1voto

chaos Puntos 11188

Supongo que todas las líneas que desea cambiar comenzar con la cadena private static final Height biomeHeight = new Height. Si sí, entonces usted puede utilizar awk:

awk -F'[(,)]' '$1=="private static final Height biomeHeight = new Height"\
{$0=$1"("$2*2"F, "$3*2"F);";}1' file

Explicación:

  • -F'[(,)]' conjuntos awk's delimitador de los personajes, (, ) y , que tenemos los parámetros de java en función de la awk campos de $2 y $3
  • $1=="..." si el primer campo es igual a la cadena
    • {$0=$1"("$2*2"F, "$3*2"F);";} a formatear la nueva cadena con el duplicado de los valores.
  • 1, 1 al final es equivalente a {print $0}, por lo tanto imprimir todo (editados y no editados) de la línea.

Editar:

La anterior awk declaración sólo funciona cuando el inicio de la línea exactamente con private static .... Cuando hay espacios que necesitan para cambiar un poco:

awk -F'[(,)]' '$1~/[ ]*private static final Height biomeHeight = new Height/\
{$0=$1"("$2*2"F, "$3*2"F);";}1'

Me registré con tu pega el código. Ver el diff:

$ diff file_old file_new
12c12
<       private static final Height biomeHeight = new Height(8.0F, 0.025F);
---
>       private static final Height biomeHeight = new Height(16F, 0.05F);

1voto

steeldriver Puntos 19092

Usted podría considerar el uso de perl por ejemplo

perl -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' file.java

El (?<=Height\() y (?=\);) son de longitud cero afirmaciones o lookarounds que el límite de los partidos de la región específica entre los delimitadores, después de que los valores numéricos se extraen mediante la captura de grupos cuyos valores $1...$3 luego pueden ser manipulados en la sustitución de la expresión que usa sprintf con la /e (evaluar) modificador.

Para aplicar de forma recursiva, puede utilizar el find comando por ejemplo,

find . -name '*.java' -execdir perl -i'.bak' -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' {} \;

Se ejecuta en su archivo de prueba:

$ perl -i'.bak' -pe 's/(?<=Height\()([0-9.]+)F(.+?)([0-9.]+)F(?=\);)/sprintf "%sF%s%sF",2*$1,$2,2*$3/e' bop.txt

a continuación, utilizando diff para confirmar el reemplazo

$ diff bop.txt.bak bop.txt
12c12
<   private static final Height biomeHeight = new Height(8.0F, 0.025F);
---
>   private static final Height biomeHeight = new Height(16F, 0.05F);

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: