2010-10-08 14 views
52

Sono uno sviluppatore Java e sto utilizzando Ubuntu per lo sviluppo. Il progetto è stato creato in Windows con Eclipse e sta utilizzando la codifica CP1252.Come convertire Windows di fine linea in Unix di fine linea (CR/LF in LF)

Per convertire in UTF-8 ho usato il programma recode:

find Web -iname \*.java | xargs recode CP1252...UTF-8 

questo comando dà questo errore:

recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.java failed: Ambiguous output in step `CR-LF..data 

ho serached su di esso e ottenere la soluzione qui: http://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27 e 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.

Bello, ma ho molti file per rimuovere il carattere/LF CR, Non posso aprire ognuno per farlo. Vi non fornisce alcuna opzione alla riga di comando per le operazioni di bash.

sed può essere utilizzato per fare questo? Come ?

Thankx =)

+0

'recode' produce questo errore quando si tenta di ricodificare un file con una combinazione mista dos (' \ r \ n' - CRLF) e unix ('\ n' LF) di nuova riga. Sfortunatamente 'fromdos', in precedenza un binario, è attualmente un alias da ricodificare che ha questo problema. – TMS

+0

non puoi fare 'vim + ex_command_one + ex_command_two ... file' – derekdreery

risposta

87

Ci dovrebbe essere un programma chiamato dos2unix che risolverà fine riga per te. Se non è già nella tua Linux box, dovrebbe essere disponibile tramite il gestore pacchetti.

+2

ho installato tofrodos che forniscono il comando fromdos, ma il problema persiste. fromdos -a GravacaoMessageHelper.java; ricodifica CP1252 ... UTF-8 GravacaoMessageHelper.java restituisce: recode: GravacaoMessageHelper.java non riuscito: output ambiguo nel passaggio 'CR-LF..data ' – MaikoID

+2

+1 per menzionare dos2unix. – Bernard

+0

@MaikoID: Allora hai problemi più grandi. la ricodifica non dovrebbe preoccuparsi comunque delle terminazioni di linea, in quanto un CR è solo un altro personaggio da convertire. E non sembra preoccuparsi della mia macchina. – cHao

8

Il comando tr può anche fare questo:

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

e dovrebbe essere disponibile a voi.

Avrete bisogno di eseguire tr da uno script, dal momento che non può funzionare con i nomi dei file. Ad esempio, creare un file 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 

Esecuzione di Web myscript.sh avrebbe elaborare tutti i file Java in Web cartella.

+0

come posso adattarmi per trovare Web -iname \ *. Java | xargs recode CP1252 ... UTF-8 – MaikoID

+0

Avresti bisogno di eseguire tr all'interno di uno script bash, dal momento che non può funzionare sui nomi di file. Modificherò la mia risposta con uno script di esempio. – KeithL

+0

Thnx per la risposta ma l'errore persiste = | Output ambiguo nel passaggio 'CR-LF..data ' – MaikoID

0

Torna a Windows, indica a Eclipse di modificare la codifica in UTF-8, quindi torna a Unix ed esegui d2u sui file.

+0

Anche se ci sono molti file, questo può essere più lavoro di quello che si è disposti a mettere dentro ... – Jonathan

+0

Cos'è d2u e dove trovarlo? –

+0

Viene rinominato occasionalmente. Sembra che Ubuntu lo chiami 'fromdos' in 10.04, e fa parte del pacchetto' tofrodos'. – Jonathan

0

Hai provato il python script by Bryan Maupin found here? (Ho modificato un po 'per essere più generica)

#!/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() 

è possibile utilizzare tale script con

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

Al fine di superare

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

semplicemente soluzione potrebbe essere quella aggiungi il flag -f per forzare la conversione.

+0

questo ha funzionato per me! – pdwalker

60

sed non può corrispondere \ n perché la nuova riga finale viene rimossa prima di la riga viene inserita nello spazio motivo ma può essere \ r, quindi è possibile convertire \ r \ n (dos) in \ n (unix) rimuovendo \ r

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

Attenzione: questo cambierà il file

originale Tuttavia, non si può cambiare da UNIX EOL a dos o vecchio Mac (\ r) da questo. Più letture qui:

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

+3

+1 Questa è una bella soluzione! Ma dovresti notare che ** 'sed -i' cambierà il file originale **! Perché la gente non si aspetterebbe che 'sed' si comporti così, quindi l'avvertimento è appropriato qui. Non molte persone conoscono '-i', quindi proveranno' sed -i ... file> file2' e non aspettatevi che il file originale venga modificato. – TMS

13

In realtà, Vim non permettono ciò che stai cercando. Inserisci vim, e digitare i seguenti comandi:

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

Il primo di questi comandi imposta la lista degli argomenti di tutti i file corrispondenti **/*.java, che è tutti i file Java, in modo ricorsivo. Il secondo di questi comandi esegue le seguenti operazioni per ogni file nella lista degli argomenti, a sua volta:

  • Imposta il terminatore allo stile Unix (si conosce già questo)
  • scrive il file fuori se e solo se è stato cambiato
  • ricavato al file successivo
+0

Soluzione perfetta! – Helbreder

+0

Questo è probabilmente molto più lento dell'uso di 'dos2unix' in un ciclo for, ma è comunque bello sapere come farlo in Vim! – jpaugh

+0

I :: cuore :: mio vim. Grazie per questo. – jQwierdy

2

mi prendo un po 'un'eccezione alla risposta di Jichao. Puoi davvero fare tutto ciò di cui ha appena parlato abbastanza facilmente. Invece di cercare un \ n, cerca l'avanzamento del modulo alla fine della riga.

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

Per passare da UNIX Torna dos, basta guardare per l'ultimo carattere sulla linea e aggiungere un avanzamento pagina ad esso. (Aggiungerò -r per rendere questo più facile con le espressioni regolari grep.)

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

In teoria, il file potrebbe essere cambiato in stile mac con l'aggiunta di codice per l'ultimo esempio che aggiunge anche la prossima linea di ingresso la prima riga fino a quando tutte le linee sono state elaborate. Non tenterò comunque di fare quell'esempio qui.

Avviso: -i cambia il file attuale. Se vuoi fare un backup, aggiungi una stringa di caratteri dopo -i. Questo sposta il file esistente in un file con lo stesso nome con i tuoi personaggi aggiunti alla fine.

Problemi correlati