Programing

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

lottogame 2020. 11. 3. 07:35
반응형

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 명령을 입력하고 파일을 저장합니다. 이제 Recode가 오류없이 실행되어야합니다.

멋지지만 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 또는 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

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


극복하기 위해

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

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


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

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

unix에서 dos로 다시 변경하려면 줄의 마지막 문자를 찾아서 양식 피드를 추가하면됩니다. (grep 정규식으로 더 쉽게 만들기 위해 -r을 추가합니다.)

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

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

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


여기에있는 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

Windows로 돌아가서 Eclipse에 인코딩을 UTF-8로 변경 한 다음 Unix로 돌아가서 d2u파일에서 실행하도록 지시 하십시오.

참고 URL : https://stackoverflow.com/questions/3891076/how-to-convert-windows-end-of-line-in-unix-end-of-line-cr-lf-to-lf

반응형