2010-10-08 37 views
52

Soy un desarrollador de Java y estoy usando Ubuntu para desarrollar. El proyecto se creó en Windows con Eclipse y está usando la codificación CP1252.Cómo convertir final de línea de Windows en Unix fin de línea (CR/LF a LF)

Convertir en UTF-8 He utilizado 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 

He serached sobre ello y buscar la solución aquí: http://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27 y dice:

Convert line endings from CR/LF to a single LF: Edit the file with vim , give the command :set ff=unix and save the file. Recode now should run without errors.

agradable pero he muchos archivos para eliminar el carácter CR/LF, No puedo abrir cada uno para hacerlo. Vi no proporciona ninguna opción a la línea de comando para operaciones de bash.

sed se puede utilizar para hacer esto? Cómo ?

Thankx =)

+0

'recode' produce este error cuando se intenta recodificar un archivo con una combinación de dos (' \ r \ n' - CRLF) y unix ('\ n' LF) newline. Desafortunadamente 'fromdos', anteriormente un binario, es actualmente un alias para recodificar que tiene este problema. – TMS

+0

no se puede hacer 'vim + ex_command_one + ex_command_two ... archivo' – derekdreery

Respuesta

87

Debe haber un programa llamado dos2unix que va a arreglar los finales de línea para usted. Si aún no está en su caja Linux, debería estar disponible a través del administrador de paquetes.

+2

He instalado tofrodos que proporcionan el comando fromdos, pero el problema persiste. fromdos -a GravacaoMessageHelper.java; recode CP1252 ... UTF-8 GravacaoMessageHelper.java returns: recode: GravacaoMessageHelper.java failed: Salida ambigua en el paso 'CR-LF..data ' – MaikoID

+2

+1 por mencionar dos2unix. – Bernard

+0

@MaikoID: Entonces tienes problemas mayores. recode no debe preocuparse por los finales de línea de todos modos, ya que un CR es simplemente otro personaje para convertir. Y no parece importarle mi máquina. – cHao

8

El comando tr también puede hacer esto:

tr -d '\ 15 \ 32' < winfile.txt> unixfile.txt

y debe estar disponible para usted.

Deberá ejecutar tr desde una secuencia de comandos, ya que no puede funcionar con los nombres de archivo. Por ejemplo, crear un archivo de myscript.sh:

#!/bin/bash 

cd ${1} 
for f in `find -iname \*.java`; do 
    echo $f 
    tr -d '\15\32' < $f > $f.tr 
    mv $f.tr $f 
    recode CP1252...UTF-8 $f 
done 

Correr Web myscript.sh procesaría todos los archivos de Java Web en carpeta.

+0

cómo puedo adaptarme para encontrar Web -iname \ *. Java | xargs recode CP1252 ... UTF-8 – MaikoID

+0

Debería ejecutar tr dentro de un script bash, ya que no puede funcionar en nombres de archivo. Editaré mi respuesta con un script de muestra. – KeithL

+0

Thnx para la respuesta pero el error persiste = | Salida ambigua en el paso 'CR-LF..data ' – MaikoID

0

Regrese a Windows, diga a Eclipse que cambie la codificación a UTF-8, luego regrese a Unix y ejecute d2u en los archivos.

+0

Aunque si hay muchos archivos, esto puede ser más trabajo de lo que está dispuesto a poner en él ... – Jonathan

+0

¿Qué es d2u y dónde encontrarlo? –

+0

Se renombra de vez en cuando. Parece que Ubuntu lo llama 'fromdos' en 10.04, y es parte del paquete' tofrodos'. – Jonathan

0

¿Has probado el python script by Bryan Maupin found here? (He modificado un poco para ser más genérico)

#!/usr/bin/env python 

import sys 

input_file_name = sys.argv[1] 
output_file_name = sys.argv[2] 

input_file = open(input_file_name) 
output_file = open(output_file_name, 'w') 

line_number = 0 

for input_line in input_file: 
    line_number += 1 
    try: # first try to decode it using cp1252 (Windows, Western Europe) 
     output_line = input_line.decode('cp1252').encode('utf8') 
    except UnicodeDecodeError, error: # if there's an error 
     sys.stderr.write('ERROR (line %s):\t%s\n' % (line_number, error)) # write to stderr 
     try: # then if that fails, try to decode using latin1 (ISO 8859-1)   
      output_line = input_line.decode('latin1').encode('utf8') 
     except UnicodeDecodeError, error: # if there's an error 
      sys.stderr.write('ERROR (line %s):\t%s\n' % (line_number, error)) # write to stderr 
      sys.exit(1) # and just keep going 
    output_file.write(output_line) 

input_file.close() 
output_file.close() 

puede utilizar ese guión con

$ ./cp1252_utf8.py file_cp1252.sql file_utf8.sql 
5

Para superar

Ambiguous output in step `CR-LF..data' 

simplemente solución podría ser agregue el indicador -f para forzar la conversión.

+0

¡esto funcionó para mí! – pdwalker

60

sed no puede coincidir \ n porque la nueva línea final se elimina antes de la línea se coloca en el espacio del patrón pero puede coincidir con \ r, por lo que puede convertir \ r \ n (dos) en \ n (unix) quitando \ r

sed -i 's/\r//g' file 

Advertencia: esto va a cambiar el archivo original

sin embargo, no se puede cambiar de Unix EOL a dos o mac de edad (\ r) por esto. Más lecturas aquí:

How can I replace a newline (\n) using sed?

+3

+1 ¡Esta es una buena solución! Pero debe tener en cuenta que ** 'sed -i' cambiará el archivo original **! Debido a que las personas no esperarían que 'sed' se comporte así, entonces la advertencia es apropiada aquí. No mucha gente sabe '-i', por lo que intentarán' sed -i ... file> file2' y no esperan que se modifique el archivo original. – TMS

13

En realidad, Vim permiten lo que estás buscando. Introduzca vim, y escribe los siguientes comandos:

:args **/*.java 
:argdo set ff=unix | update | next 

El primero de estos comandos establece la lista de argumentos a cada archivo que coincida con **/*.java, que es de todos los archivos de Java, de forma recursiva. El segundo de estos comandos hace lo siguiente para cada archivo en la lista de argumentos, a su vez:

  • Establece las terminaciones de líneas de estilo Unix (eso ya lo sabe)
  • escribe el archivo de salida si y sólo si se ha cambiado
  • pasa al siguiente archivo
+0

¡La solución perfecta! – Helbreder

+0

Esto es probablemente mucho más lento que usar 'dos2unix' en un for-loop, ¡pero aún así es bueno saber cómo hacerlo en Vim! – jpaugh

+0

I :: heart :: my vim. Gracias por esto. – jQwierdy

2

voy a tomar una pequeña excepción a la respuesta de Jichao. En realidad, puede hacer todo lo que acaba de hablar con bastante facilidad. En lugar de buscar un \ n, simplemente busque el feed de formulario al final de la línea.

sed -i 's/\r$//' ${FILE_NAME} 

para cambiar de nuevo a unix dos, simplemente busque el último carácter en la línea y agregar un salto de página a la misma. (Voy a añadir -r para hacer esto más fácil con las expresiones regulares grep.)

sed -ri 's/(.)$/\1\r/ ${FILE_NAME} 

Teóricamente, el archivo podría ser cambiado a estilo Mac mediante la adición de código para el último ejemplo de que también añade la siguiente línea de entrada para la primera línea hasta que todas las líneas hayan sido procesadas. Sin embargo, no intentaré dar ese ejemplo aquí.

Advertencia: -i cambia el archivo real. Si desea que se realice una copia de seguridad, agregue una cadena de caracteres después de -i. Esto moverá el archivo existente a un archivo con el mismo nombre con los caracteres agregados al final.

Cuestiones relacionadas