저는 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로 다시 변경하려면 줄의 마지막 문자를 찾아서 양식 피드를 추가하면됩니다. ( -r
grep 정규식을 사용하여 더 쉽게 추가 할 것입니다.)
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
