[windows] Unix 줄 끝에서 Windows 줄 끝을 변환하는 방법 (CR / LF에서 LF로)

저는 Java 개발자이고 Ubuntu를 사용하여 개발하고 있습니다. 이 프로젝트는 Eclipse와 함께 Windows에서 생성되었으며 Windows-1252 인코딩을 사용하고 있습니다.

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

나는 그것에 대해 검색하고 Bash 및 Windows, Recode : Ambiguous output in step`data..CR-LF ‘ 에서 솔루션을 얻었으며 다음 과 같이 말합니다.

줄 끝을 CR / LF에서 단일 LF로 변환 : Vim으로 파일을 편집하고 명령을 내리고 파일을 :set ff=unix저장합니다. 이제 Recode가 오류없이 실행되어야합니다.

좋지만 CR / LF 문자를 제거 할 파일이 많고 각 파일을 열 수 없습니다. Vi는 Bash 작업을위한 명령 줄 옵션을 제공하지 않습니다.

이를 위해 sed를 사용할 수 있습니까? 어떻게?



답변

dos2unix줄 끝을 수정 하는 프로그램이 있어야 합니다. Linux 상자에없는 경우 패키지 관리자를 통해 사용할 수 있습니다.


답변

sed는 라인이 패턴 공간에 들어가기 전에 후행 개행이 제거 되었기 때문에 \ n 일치 할 수 없지만 \ r과 일치 할 수 있으므로 \ r을 제거하여 \ r \ n (dos)를 \ n (unix)로 변환 할 수 있습니다.

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

경고: 원본 파일이 변경됩니다.

그러나 이것으로 unix EOL에서 dos 또는 old mac (\ r)으로 변경할 수 없습니다. 여기에 더 많은 읽기 :

sed를 사용하여 줄 바꿈 (\ n)을 어떻게 바꿀 수 있습니까?


답변

사실, vim은 당신이 찾고있는 것을 허용합니다. vim을 입력하고 다음 명령을 입력하십시오.

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

이 명령 중 첫 번째는 인수 목록을 **/*.java모든 Java 파일 인 일치하는 모든 파일에 반복적으로 설정합니다. 두 번째 명령은 인수 목록의 각 파일에 대해 차례로 다음을 수행합니다.

  • 줄 끝을 Unix 스타일로 설정합니다 (이미 알고 있음).
  • 변경된 경우 파일을 작성합니다.
  • 다음 파일로 진행


답변

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 파일이 처리됩니다.


답변

jichao의 답변에 약간의 예외를 두겠습니다. 그가 방금 말한 모든 것을 상당히 쉽게 할 수 있습니다. 를 찾는 대신 \n줄 끝에서 캐리지 리턴을 찾으십시오.

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

unix에서 dos로 다시 변경하려면 줄의 마지막 문자를 찾아서 양식 피드를 추가하면됩니다. ( -rgrep 정규식을 사용하여 더 쉽게 추가 할 것입니다.)

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

이론적으로 파일은 모든 행이 처리 될 때까지 첫 번째 행에 다음 입력 행을 추가하는 코드를 마지막 예제에 추가하여 mac 스타일로 변경할 수 있습니다. 하지만 여기서는 그 예를 만들지 않겠습니다.

경고 : -i는 실제 파일을 변경합니다. 백업을하려면 뒤에 문자열을 추가하십시오 -i. 그러면 기존 파일이 끝에 문자가 추가 된 동일한 이름의 파일로 이동합니다.


답변

극복하기 위해

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

단순히 해결책은 -f변환을 강제 하기 위해 플래그를 추가하는 것 입니다.


답변

여기에있는 Bryan Maupin파이썬 스크립트 를 사용해 보셨습니까 ? (좀 더 일반적으로 수정했습니다)

#!/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