Cómo quitar parte de una cuerda

Cómo quitar parte de una cuerda

Sigo leyendo la seddocumentación y muchas publicaciones, pero parece que no puedo resolver esto. Tengo una gran cantidad de archivos Java. En esos archivos hay llamadas a un método que toma la enumeración convertida a un número entero usando el toInt()método. Quiero revisar todos los archivos y deshacerme de ellos .toInt()para una enumeración específica.

Esto es lo que quiero. Las cadenas de código originales:

foo(ENUM_NAME.ENUM_VALUE.toInt(), arg2, arg3)
foo(ENUM_NAME.ENUM_VALUE2.toInt(), arg2, arg3)

Quiero terminar con:

foo(ENUM_NAME.ENUM_VALUE, arg2, arg3)
foo(ENUM_NAME.ENUM_VALUE2, arg2, arg3)

ENUM_VALUEPodría haber cientos de posibilidades diferentes, por lo que no puedo codificar. Parece que hay cierta confusión sobre lo que se necesita cambiar, así que intentaré ser más claro.

Hay una enumeración llamada TRANF_FIELDen mis archivos Java. Los valores disponibles para esa enumeración podrían ser uno de dos mil valores, seguido de .toInt(). Necesito deshacerme del .toInt(). Todos los nombres de las funciones son irrelevantes.

Los siguientes son ejemplos de construcciones de código que se intercalan en mi código Java y cómo deben procesarse:

TRANF_FIELD.TRANF_VALUE_1.toInt()
                Quiero que los .toInt()eliminen, que queden TRANF_FIELD.TRANF_VALUE_1sobrantes.
TRANF_FIELD.TRANF_KILL_ME.toInt()
                Quiero que .toInt()se elimine, dejando TRANF_FIELD.TRANF_KILL_ME
TRANG_FIELD.TRANG_VALUE_1.toInt()
                Sin cambios, porque no es así TRANF_FIELD.
TRANF_FIELD.TRANF_VALUE_1.length()
                No hay cambios, porque no lo es .toInt().

Respuesta1

Parece que quieres cambiar todas las apariciones de

TRANF_FIELD.some_enum_value.toInt()

a

TRANF_FIELD.that_enum_value

dejando otras enumeraciones (p. ej., TRANG_FIELD.TRANG_VALUE.toInt()) y otros métodos (p. ej., TRANF_FIELD.TRANF_VALUE.length()) solos. Esto parece simple:

sed 's/\(TRANF_FIELD\.[A-Za-z0-9_]*\)\.toInt()/\1/'

dónde

  • [A-Za-z0-9_]*es cualquier número de caracteres alfanuméricos (incluidos los guiones bajos). Esto está destinado a coincidir con cualquier valor de enumeración válido. En realidad, [A-Za-z_][A-Za-z0-9_]*sería mejor, porque [A-Za-z0-9_]*podría coincidir con una cadena vacía o una que comience con un dígito.
  • \(\)agrupa el nombre de la enumeración ( TRANF_FIELD), el punto literal ( \.) y el valor de la enumeración (desde la primera viñeta).
  • \1significa "reemplazar la cadena completa que encontró con el primer grupo", es decir, descartar la .toInt()parte.
  • Para manejar múltiples apariciones por línea, agregue g(global) después de la última barra.
  • Esto no manejará espacios en blanco incrustados, por ejemplo, TRANF_FIELD . TRANF_VALUE. Arreglar esto se deja como ejercicio.
  • Esto no manejará expresiones que estén divididas en líneas; p.ej,

        i = TRANF_FIELD
                 .TRANF_VALUE.toInt();
    

    Eso es más difícil de arreglar.

Respuesta2

Gracias por toda su ayuda amigos. Agregué -i de una respuesta, incluida la ruta a todos los archivos java, a lo que sugirió G-man y funciona. Si alguna vez están en Long Island, les invitaré una cerveza. Eso me ahorró mucho tiempo.

sed -i 's/\(TRANF_FIELD\.[A-Za-z0-9_]*\)\.toInt()/\1/g' 

Respuesta3

Dependiendo de su sistema operativo, una línea ( -i) sedpodría hacer esto:

sed -i 's:\.toInt()::' filename

Donde simplemente sustituirá la instancia de ".toInt()" por "" - se .escapa para que no actúe como comodín.

Como menciona varios archivos, tendrá que repetir este comando buscando todos los archivos en el directorio y subdirectorios actuales:

find . -type f -exec sed -i 's:\.toInt()::' {} \;

Sin embargo, esto generará un error si los nombres de archivos contienen espacios, por lo que podemos usar el xargscomando para solucionar esto, que colocará comillas alrededor de todos los nombres de archivos:

find . -type f | xargs -I{} sed -i 's:\.toInt()::' "{}"

Sin embargo, esto también seleccionará archivos compilados, por lo que para evitarlos podemos usar una característica útil para perlignorarlos:

find . -type f | perl -nle 'print if -T' | xargs -I{} sed -i 's:\.toInt()::' "{}"

Respuesta4

sed 's/ENUM_NAME\.\(.*\)\.toInt()/ENUM_NAME.\1/g' 

información relacionada