Sigo leyendo la sed
documentació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_VALUE
Podrí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_FIELD
en 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 quedenTRANF_FIELD.TRANF_VALUE_1
sobrantes.
TRANF_FIELD.TRANF_KILL_ME.toInt()
Quiero que.toInt()
se elimine, dejandoTRANF_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).\1
significa "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
) sed
podrí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 xargs
comando 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 perl
ignorarlos:
find . -type f | perl -nle 'print if -T' | xargs -I{} sed -i 's:\.toInt()::' "{}"
Respuesta4
sed 's/ENUM_NAME\.\(.*\)\.toInt()/ENUM_NAME.\1/g'