web-dev-qa-db-fra.com

Comment convertir une fin de ligne Windows en fin de ligne Unix (CR/LF en LF)

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 =)

62
MaikoID

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.

103
cHao

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?

71
Jichao

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:

  • Définit les fins de ligne sur le style Unix (vous le savez déjà)
  • Ecrit le fichier si et seulement s'il a été changé
  • Produit au fichier suivant
15
Arandur

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.

8
KeithL

Pour vaincre

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

la solution tout simplement pourrait être d’ajouter le drapeau -f pour forcer la conversion.

6
V_V

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. 

3
John Chesshir

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
1
Anthony O.

Retournez à Windows, dites à Eclipse de changer le codage en UTF-8, puis de nouveau en Unix et exécutez d2u sur les fichiers.

0
Jonathan