88

私は Java 開発者であり、開発に Ubuntu を使用しています。プロジェクトは Eclipse を使用して Windows で作成され、Windows-1252エンコーディングを使用しています。

UTF-8 に変換するには、recodeプログラムを使用しました。

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

私はそれについて検索し、Bash と Windows で解決策を見つけました。

行末を CR/LF から単一の LF に変換する: Vim でファイルを編集し、コマンドを入力:set ff=unixしてファイルを保存します。Recode はエラーなしで実行されるはずです。

いいのですが、CR/LF 文字を削除するファイルがたくさんあり、それぞれを開いて削除することはできません。Vi には、Bash 操作用のコマンド ライン オプションがありません。

これを行うためにsedを使用できますか?どのように?

4

8 に答える 8

128

dos2unix行末を修正するというプログラムがあるはずです。Linux ボックスにまだない場合は、パッケージ マネージャーを介して利用できるはずです。

于 2010-10-08T13:40:22.060 に答える
96

sed\nは、行がパターン スペースに挿入される前に末尾の改行が削除されるため一致しませんが、一致する可能性があるため、 \r を削除して (DOS) を(Unix) に\r変換できます。\r\n\n

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

警告:これにより元のファイルが変更されます

ただし、これでは Unix EOL から DOS や古い Mac ( \r) に変更することはできません。ここでより多くの読み物:

sed を使用して改行 (\n) を置き換えるにはどうすればよいですか?

于 2013-10-09T21:51:32.407 に答える
15

実際、Vim はあなたが探しているものを許可します。Vim に入り、次のコマンドを入力します。

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

これらのコマンドの最初のコマンドは、引数リストを に一致する**/*.javaすべてのファイル (すべて Java ファイル) に再帰的に設定します。これらのコマンドの 2 番目は、引数リスト内の各ファイルに対して次の処理を順番に実行します。

  • 行末を Unix スタイルに設定します (これは既にご存じでしょう)。
  • ファイルが変更されている場合はファイルを書き出します
  • 次のファイルに進みます
于 2014-08-19T13:59:11.350 に答える
11

ジチャオの答えには少し例外があります。彼が話したすべてのことは、実際にはかなり簡単に実行できます。を探す代わりに\n、行末のキャリッジ リターンを探すだけです。

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

Unix から DOS に戻すには、行の最後の文字を探してフォーム フィードを追加します。-r( grep正規表現でこれを簡単にするために追加します。)

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

理論的には、すべての行が処理されるまで、次の入力行を最初の行に追加するコードを最後の例に追加することで、ファイルを Mac スタイルに変更できます。ただし、ここでその例を作成しようとはしません。

警告: -i実際のファイルを変更します。バックアップを作成したい場合は、 の後に文字列を追加します-i。これにより、既存のファイルが、末尾に文字が追加された同じ名前のファイルに移動されます。

更新: Unix から DOS への変換は、最後の文字を探す手間を省くことで単純化し、より効率的にすることができます。これにより、機能するために -r を使用する必要がなくなります。

sed -i 's/$/\r/' "${FILE_NAME}"
于 2017-05-26T20:51:01.730 に答える
9

tr コマンドでもこれを行うことができます。

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

利用できるはずです。

ファイル名を処理できないため、スクリプト内から tr を実行する必要があります。たとえば、ファイル myscript.sh を作成します。

#!/bin/bash

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すると、現在のディレクトリとそのサブディレクトリ内のすべての Java ファイルが処理されます。

于 2010-10-08T13:44:01.277 に答える
5

克服するために

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

単純な解決策は-f、変換を強制するフラグを追加することです。

于 2012-05-16T13:29:59.173 に答える
0

ここにある 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
于 2010-12-08T15:49:01.467 に答える
-1

Windows に戻り、Eclipse にエンコーディングを UTF-8 に変更するように指示してから、Unix に戻ってファイルを実行d2uします。

于 2010-10-08T14:10:57.267 に答える