Eliminar caracteres al final de las líneas usando find y sed

Eliminar caracteres al final de las líneas usando find y sed

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 gsedsince en mac sedes 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 $fen los comandos echoy gsed.

En este caso, afortunadamente, es fácil escribir código que funcione de manera confiable: simplemente use -execla 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 sedscript:

find . -name \*.scala -print -exec gsed -i -e 's/\x0D$//g; s/;$//;' {} +

Respuesta2

Es posible que desees ejecutarlos todos dos2unixantes 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.

información relacionada