私はJava開発者であり、開発にUbuntuを使用しています。このプロジェクトはEclipseを使用してWindowsで作成され、CP1252エンコーディングを使用しています。
UTF-8に変換するには、再コードプログラムを使用しました。
find Web -iname \*.Java | xargs recode CP1252...UTF-8
このコマンドはこのエラーを与えます:
recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.Java failed: Ambiguous output in step `CR-LF..data
私はそれについて調べて、ここで解決策を取得しました: http://fvue.nl/wiki/Bash_and_Windows#Recode:_Ambiguous_output_in_step_.60data..CR-LF.27 そしてそれは言います:
行末をCR/LFから単一のLFに変換します。vimでファイルを編集し、コマンド:set ff = unixを指定してファイルを保存します。再コードはエラーなしで実行されるはずです。
いいですが、CR/LF文字を削除するファイルがたくさんあるので、それぞれを開くことはできません。 Viは、bash操作のコマンドラインにオプションを提供しません。
sedを使用してこれを行うことができますか?どうやって ?
Thankx =)
行末を修正するdos2unix
というプログラムが必要です。 Linuxボックスにまだない場合は、パッケージマネージャーから入手できるはずです。
sedは\ nに一致できません。これは、行がパターンスペースに配置される前に末尾の改行が削除されるが、\ rに一致するため、\ rを削除することで\ r\n(dos)を\ n(unix)に変換できるためです
sed -i 's/\r//g' file
警告:これは元のファイルを変更します
ただし、これによってUNIX EOLからdosまたは古いmac(\ r)に変更することはできません。その他の読み物はこちら:
実際、vimはあなたが探しているものを許可します。 vimと入力し、次のコマンドを入力します。
:args **/*.Java
:argdo set ff=unix | update | next
これらのコマンドの最初は、引数リストを**/*.Java
に一致するすべてのファイルに設定します。これはすべてJava files、recursively。)です。これらのコマンドの2番目は、引数内の各ファイルに対して次の処理を行いますリスト、順番に:
Trコマンドもこれを行うことができます。
tr -d '\ 15\32' <winfile.txt> unixfile.txt
そしてあなたが利用できるはずです。
ファイル名では機能しないため、スクリプト内からtrを実行する必要があります。たとえば、ファイル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
Myscript.sh Webを実行すると、フォルダーWeb内のすべてのJavaファイルが処理されます。
私はjichaoの答えに少し例外を取ります。あなたは実際に彼が話したばかりのすべてをかなり簡単に行うことができます。\nを探す代わりに、行末でフォームフィードを探します。
sed -i 's/\r$//' ${FILE_NAME}
UNIXからdosに戻すには、単に行の最後の文字を探し、それにフォームフィードを追加します。 (grep正規表現でこれを簡単にするために-rを追加します。)
sed -ri 's/(.)$/\1\r/' ${FILE_NAME}
理論的には、最後の例にコードを追加し、すべての行が処理されるまで入力の次の行を最初の行に追加することにより、ファイルをmacスタイルに変更できます。ただし、ここではその例を作成しません。
警告: -iは実際のファイルを変更します。バックアップを作成する場合は、-iの後に文字列を追加します。これにより、既存のファイルが、文字が最後に追加された同じ名前のファイルに移動します。
克服するために
Ambiguous output in step `CR-LF..data'
単に解決策は-f
変換を強制するフラグ。
ここにあるBryan Maupinによるpythonスクリプト を試しましたか? (より一般的になるように少し変更しました)
#!/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()
このスクリプトは
$ ./cp1252_utf8.py file_cp1252.sql file_utf8.sql
Windowsに戻り、EclipseにエンコードをUTF-8に変更してからUnixに戻ってd2u
ファイル。