Je suis un développeur Java et j'utilise Ubuntu pour développer. Le projet a été créé sous Windows avec Eclipse et utilise le codage CP1252.
Pour convertir en UTF-8, j'ai utilisé le programme de recodage:
find Web -iname \*.Java | xargs recode CP1252...UTF-8
cette commande donne cette erreur:
recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.Java failed: Ambiguous output in step `CR-LF..data
J'en ai parlé et j'ai trouvé la solution ici: http://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27 et il dit:
Convertir les fins de ligne de CR/LF en a single LF: Editez le fichier avec vim, donnez la commande: set ff = unix et enregistrez le fichier. Recode maintenant devrait fonctionner sans fautes.
Bien, mais j'ai beaucoup de fichiers pour supprimer le caractère CR/LF, je ne peux pas les ouvrir pour le faire. Vi ne fournit aucune option de ligne de commande pour les opérations bash.
sed peut être utilisé pour faire cela? Comment ?
Thankx =)
Il devrait y avoir un programme appelé dos2unix
qui corrigera les fins de ligne pour vous. Si ce n'est pas déjà sur votre machine Linux, il devrait être disponible via le gestionnaire de paquets.
sed ne peut pas correspondre\n car la nouvelle ligne finale est supprimée avant la ligne est placée dans l’espace du modèle, mais peut correspondre à\r; vous pouvez donc convertir\r\n (dos) en\n (unix) en supprimant\r
sed -i 's/\r//g' file
Attention: cela changera le fichier original
Cependant, vous ne pouvez pas changer d’unix EOL à dos ou vieux mac (\ r) par ceci. Plus de lectures ici:
Comment puis-je remplacer une nouvelle ligne (\ n) en utilisant sed?
En fait, vim permet ce que vous recherchez. Entrez vim et tapez les commandes suivantes:
:args **/*.Java
:argdo set ff=unix | update | next
La première de ces commandes définit la liste d'arguments sur chaque fichier correspondant à **/*.Java
, ce qui correspond à tous les fichiers Java, de manière récursive. La deuxième de ces commandes effectue les opérations suivantes sur chaque fichier de la liste des arguments:
La commande tr peut aussi faire ceci:
tr -d '\ 15\32' <winfile.txt> unixfile.txt
et devrait être disponible pour vous.
Vous devrez exécuter tr depuis un script, car il ne peut pas fonctionner avec les noms de fichiers. Par exemple, créez un fichier 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
L'exécution de myscript.sh Web traiterait tous les fichiers Java du dossier Web.
Pour vaincre
Ambiguous output in step `CR-LF..data'
la solution tout simplement pourrait être d’ajouter le drapeau -f
pour forcer la conversion.
Je vais faire une petite exception à la réponse de Jichao. Vous pouvez réellement faire tout ce dont il vient de parler assez facilement. Au lieu de chercher un\n, cherchez simplement un formulaire à la fin de la ligne.
sed -i 's/\r$//' ${FILE_NAME}
Pour revenir d'unix à un dos, recherchez simplement le dernier caractère de la ligne et ajoutez-y un flux de formulaire. (Je vais ajouter -r pour rendre cela plus facile avec les expressions régulières de grep.)
sed -ri 's/(.)$/\1\r/' ${FILE_NAME}
Théoriquement, le fichier pourrait être modifié en style mac en ajoutant du code au dernier exemple, qui ajoute également la ligne d'entrée suivante à la première ligne jusqu'à ce que toutes les lignes aient été traitées. Je ne vais pas essayer de faire cet exemple ici, cependant.
Attention: -i modifie le fichier actuel. Si vous souhaitez effectuer une sauvegarde, ajoutez une chaîne de caractères après -i. Cela déplacera le fichier existant dans un fichier du même nom avec vos caractères ajoutés à la fin.
Avez-vous essayé le script python de Bryan Maupin trouvé ici ? (Je l'ai un peu modifié pour être plus générique)
#!/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()
Vous pouvez utiliser ce script avec
$ ./cp1252_utf8.py file_cp1252.sql file_utf8.sql
Retournez à Windows, dites à Eclipse de changer le codage en UTF-8, puis de nouveau en Unix et exécutez d2u
sur les fichiers.