web-dev-qa-db-ja.com

Unixの行末でWindowsの行末を変換する方法(CR / LFからLF)

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

66
MaikoID

行末を修正するdos2unixというプログラムが必要です。 Linuxボックスにまだない場合は、パッケージマネージャーから入手できるはずです。

108
cHao

sedは\ nに一致できません。これは、行がパターンスペースに配置される前に末尾の改行が削除されるが、\ rに一致するため、\ rを削除することで\ r\n(dos)を\ n(unix)に変換できるためです

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

警告:これは元のファイルを変更します

ただし、これによってUNIX EOLからdosまたは古いmac(\ r)に変更することはできません。その他の読み物はこちら:

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

77
Jichao

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

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

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

  • 行末をUnixスタイルに設定します(既に知っています)
  • 変更された場合にのみファイルを書き出します
  • 次のファイルに進みます
15
Arandur

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ファイルが処理されます。

8
KeithL

私はjichaoの答えに少し例外を取ります。あなたは実際に彼が話したばかりのすべてをかなり簡単に行うことができます。\nを探す代わりに、行末でフォームフィードを探します。

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

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

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

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

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

6
John Chesshir

克服するために

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

単に解決策は-f変換を強制するフラグ。

6
V_V

ここにある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
1
Anthony O.

Windowsに戻り、EclipseにエンコードをUTF-8に変更してからUnixに戻ってd2uファイル。

0
Jonathan