Comment convertir Windows end of line Dans Unix end of line (CR / LF à LF))

je suis un développeur Java et J'utilise Ubuntu pour développer. Le projet a été créé dans Windows avec Eclipse et il utilise L'encodage CP1252.

pour convertir en UTF-8 j'ai utilisé le programme recode:

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 obtenir la solution ici: http://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27 et il est écrit:

Convertir les fins de ligne de CR / LF en a simple LF: modifier le fichier avec vim , donnez la commande: Définir ff = unix et enregistrer fichier. Recode maintenant devrait s'exécuter sans erreurs.

Nice mais j'ai de nombreux fichiers pour supprimer le caractère CR/LF, Je ne peux pas ouvrir chacun pour le faire. Vi ne fournit aucune option à la ligne de commande pour les opérations bash.

sed peut être utilisé pour faire cela ? Comment ?

Thankx =)

58
demandé sur MaikoID 2010-10-08 17:37:54

8 réponses

il devrait y avoir un programme appelé dos2unix qui fixera les fins de ligne pour vous. Si elle n'est pas déjà sur votre machine Linux, elle devrait être disponible via le gestionnaire de paquets.

98
répondu cHao 2014-02-19 09:32:16

sed ne peut pas correspondre à \n parce que la nouvelle ligne arrière est enlevée avant la ligne est placée dans l'espace de motif mais peut correspondre à \r, de sorte que vous pouvez convertir \r\n (dos) en \n (unix) en supprimant \r

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

Avertissement: cela va changer le fichier d'origine

cependant, vous ne pouvez pas passer d'unix EOL à dos ou vieux mac (\r) par ceci. Plus de lectures ici:

Comment remplacer une nouvelle ligne (\n) utiliser sed?

67
répondu Jichao 2017-05-23 11:33:16

en fait, vim autorise ce que vous cherchez. 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 de chaque fichier correspondant à **/*.java , qui est tous les fichiers Java, de façon récursive. La seconde de ces commandes fait ce qui suit à chaque fichier dans la liste d'arguments, à son tour:

  • définit les fins de ligne au style Unix (vous le savez déjà)
  • Écrit le fichier iff il a été modifié
  • passe au fichier suivant
14
répondu Arandur 2014-08-19 13:59:11

la commande tr peut aussi faire ceci:

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

et devrait être disponible pour vous.

vous aurez besoin d'exécuter tr À partir d'un script, car il ne peut pas fonctionner avec les noms de fichiers. Par exemple, créer un fichier myscript.sh:

#!/bin/bash

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

Running myscript.sh Web traiterait tous les fichiers java dans le dossier Web.

8
répondu KeithL 2010-10-08 14:50:53

pour surmonter

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

la solution la plus simple pourrait être d'ajouter l'indicateur -f pour forcer la conversion.

5
répondu V_V 2012-05-16 13:29:59

je vais faire une petite exception à la réponse de jichao. Tu peux faire tout ce dont il a parlé assez facilement. Au lieu de chercher une \n, il suffit de regarder pour le saut à la fin de la ligne.

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

pour passer d'unix à dos, il suffit de rechercher le dernier caractère sur la ligne et d'y ajouter un feed de formulaire. (Je vais ajouter -r pour rendre cela plus facile avec grep expressions régulières.)

sed -ri 's/(.)$/\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 suivante d'entrée à la première ligne jusqu'à ce que toutes les lignes aient été traitées. Je n'essaierai pas de faire cet exemple ici.

Avertissement: -je modifie le fichier réel. Si vous voulez faire une sauvegarde, ajoutez une chaîne de caractères après-I. Cela déplacera le fichier existant vers un fichier avec le même nom avec vos caractères ajoutés à la fin.

3
répondu John Chesshir 2018-08-24 16:33:18

avez-vous essayé le script python de Bryan Maupin trouvé ici ? (J'ai modifié un peu 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
0
répondu Anthony O. 2010-12-08 15:49:01

retournez à Windows, dites à Eclipse de changer l'encodage en UTF-8, puis retournez à Unix et lancez d2u sur les fichiers.

-1
répondu Jonathan 2010-10-08 14:10:57