
Para una base de código convertida de Java a Scala, hay muchos archivos con punto y coma innecesarios al final. Aquí está mi intento de eliminarlos:
for f in $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/;$//g"; done
(Nota: usar gsed
since en mac sed
es basura...)
Sin embargo, esto simplemente no funciona: los puntos y coma no se eliminan.
Tenga en cuenta que ejecutar en un solo archivo como:
for f in $(find . -name testfile); do echo $f; gsed -i $f -e "s/;$//g"; done
hacetrabajar.
Respuesta1
Nunca uses esto:
for f in $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done
Esto funcionahastatiene un archivo cuyo nombre tiene espacios en blanco u otros caracteres activos del shell. Por un lado, el caparazón realizará ambasdivisión de palabrasyexpansión del nombre de rutaen la salida de $(find . -name \*.scala)
. Incluso sin eso, el caparazón funcionarádivisión de palabras yexpansión del nombre de rutasobre las apariciones no citadas de $f
en los comandos echo
y gsed
.
En este caso, afortunadamente, es fácil escribir código que funcione de manera confiable: simplemente use -exec
la opción buscar:
find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g' {} +
Si desea eliminar los puntos y coma finales al mismo tiempo, simplemente agregue un comando de sustitución más al sed
script:
find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g; s/;$//;' {} +
Respuesta2
Es posible que desees ejecutarlos todos dos2unix
antes de ejecutar sed. ¿Cómo obtener dos2unix, te preguntarás? Bueno, esta es la razón principal para agregar otra respuesta aquí (y porque todavía no tengo suficiente representante para agregar comentarios). Si quieres sobrevivir a OSX, necesitas elAdministrador de paquetes caseros. Lo primero después de instalar Homebrew (2 minutos) esactualizar la fiesta!! OSX no ha actualizado bash en años. Con eso puedes actualizar las utilidades de Unix.
En caso de que hayas tenido malas experiencias con MacPorts y Fink en el pasado, Homebrew no es así. En realidad. OSX sin Homebrew es como Windows sin Cygwin. Bueno en realidad no; Pero se entiende la idea.
Respuesta3
Encontré el motivo: los archivos tenían ^M
(estilo DOS CRLF
), así que primero tuve que hacer:
for f in $(find . -name \*.scala); do echo $f; gsed -i $f -e "s/\x0D$//"; done
Luego, el comando que se muestra en el OP funciona bien.