Soy un desarrollador de Java y estoy usando Ubuntu para desarrollar. El proyecto se creó en Windows con Eclipse y utiliza la codificación Windows-1252 .
Para convertir a UTF-8 he usado el programa de recodificación :
find Web -iname \*.java | xargs recode CP1252...UTF-8
Este comando da este error:
recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.java failed: Ambiguous output in step `CR-LF..data
Lo busqué y obtuve la solución en Bash y Windows, Recode: Salida ambigua en el paso `data..CR-LF ' y dice:
Convierta los finales de línea de CR / LF a un solo LF: Edite el archivo con Vim, dé el comando
:set ff=unix
y guarde el archivo. Recode ahora debería ejecutarse sin errores.
Bien, pero tengo muchos archivos para eliminar el carácter CR / LF, y no puedo abrir cada uno para hacerlo. Vi no proporciona ninguna opción de línea de comandos para operaciones Bash.
¿Se puede usar sed para hacer esto? ¿Cómo?
windows
linux
end-of-line
MaikoID
fuente
fuente
recode
produce este error al intentar recodificar un archivo con codificación de nueva línea DOS (\r\n
- CRLF) y Unix (\n
LF) mixtos . Lamentablementefromdos
, anteriormente un binario, actualmente es un alias para recodificar el que tiene este problema.vim +ex_command_one +ex_command_two ... file
awk
solución en las respuestas.Respuestas:
Debería haber un programa llamado
dos2unix
que arregle los finales de línea por usted. Si aún no está en su caja de Linux, debería estar disponible a través del administrador de paquetes.fuente
fromdos
es solo un alias derecode
, y eso producirá el error OP mencionado en archivos con codificación DOS mixta (\ r \ n - CRLF) y unix (\ n LF). Solodos2unix
funciona universalmente.find ./ -name "*.java" -exec dos2unix {} +
.sed no puede coincidir con \ n porque la nueva línea final se elimina antes de que la línea se coloque en el espacio del patrón, pero puede coincidir con \ r, por lo que puede convertir \ r \ n (dos) a \ n (unix) eliminando \ r
Advertencia: esto cambiará el archivo original
Sin embargo, no puede cambiar de unix EOL a dos o mac antiguo (\ r) con esto. Más lecturas aquí:
¿Cómo puedo reemplazar una nueva línea (\ n) usando sed?
fuente
sed -i
cambiará el archivo original ! Debido a que la gente no esperaríased
comportarse así, la advertencia es apropiada aquí. No mucha gente lo sabe,-i
así que lo intentaránsed -i ... file > file2
y no esperarán que se modifique el archivo original.sed
variantes reconocen la secuencia simbólica no estándar\r
. Pruebe con un carácter literal ctrl-M en ese caso (en muchos shells, escriba ctrl-V ctrl-M para producir el carácter de control literal).De hecho, vim permite lo que estás buscando. Ingrese vim y escriba los siguientes comandos:
El primero de estos comandos establece la lista de argumentos para cada coincidencia de archivos
**/*.java
, que son todos los archivos Java, de forma recursiva. El segundo de estos comandos hace lo siguiente para cada archivo en la lista de argumentos, a su vez:fuente
dos2unix
en un bucle for, ¡pero aún es bueno saber cómo hacerlo en Vim!El comando tr también puede hacer esto:
y debería estar disponible para usted.
Deberá ejecutar tr desde dentro de un script, ya que no puede funcionar con nombres de archivo. Por ejemplo, cree un archivo myscript.sh:
La ejecución
myscript.sh
procesará todos los archivos java en el directorio actual y sus subdirectorios.fuente
Haré una pequeña excepción a la respuesta de jichao. De hecho, puedes hacer todo lo que acaba de mencionar con bastante facilidad. En lugar de buscar un
\n
, simplemente busque el retorno de carro al final de la línea.Para cambiar de unix a dos, simplemente busque el último carácter en la línea y agregue un formulario de alimentación. (Agregaré
-r
para facilitar esto con expresiones regulares grep).En teoría, el archivo podría cambiarse al estilo mac agregando código al último ejemplo que también agrega la siguiente línea de entrada a la primera línea hasta que se hayan procesado todas las líneas. Sin embargo, no intentaré dar ese ejemplo aquí.
Advertencia: -i cambia el archivo real. Si desea realizar una copia de seguridad, agregue una cadena de caracteres después
-i
. Esto moverá el archivo existente a un archivo con el mismo nombre con tus personajes agregados al final.fuente
sed -i 's/$/\r/' ${FILE_NAME}
...-r
opción no es portátil; sised
no lo tiene, quizás intente-E
.Para superar
simplemente la solución podría ser agregar una
-f
bandera para forzar la conversión.fuente
¿ Probaste el script de Python de Bryan Maupin que se encuentra aquí ? (Lo modifiqué un poco para que sea más genérico)
Puedes usar ese script con
fuente
Vuelva a Windows, dígale a Eclipse que cambie la codificación a UTF-8, luego vuelva a Unix y ejecute
d2u
los archivos.fuente
fromdos
en 10.04 y es parte del paquetetofrodos
.