BOM이있는 UTF-8 인코딩 파일이 있으며 BOM을 제거하고 싶습니다. 파일에서 BOM을 제거하는 Linux 명령 행 도구가 있습니까?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
BOM이있는 UTF-8 인코딩 파일이 있으며 BOM을 제거하고 싶습니다. 파일에서 BOM을 제거하는 Linux 명령 행 도구가 있습니까?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
답변:
파일에 UTF-8 BOM이 포함되어 있는지 확실하지 않은 경우, GNU 구현으로 가정 sed
하면 BOM이 존재하는 경우 BOM을 제거하거나 그렇지 않은 경우 변경하지 않습니다.
sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt
다음 -i
옵션으로 기존 파일을 덮어 쓸 수도 있습니다.
sed -i '1s/^\xEF\xBB\xBF//' orig.txt
en_US.UTF-8
로케일로 테스트 했으며 효과가있었습니다. 언제 실패할까요?
-<U+FEFF>\chapter{xxx}
After : +\chapter{xxx}^M
설명 : 라텍스 파일에서 오타에 MS 단어를 사용합니다. 리눅스에서 라텍스는 언급 된 오류를 보이고있다. git 시스템에서 출력됩니다. 이 특별한 경우를 잡기 위해 표현을 어떻게 바꿀 수 있습니까?
BOM은 UTF-8에서 의미가 없습니다. 이들은 일반적으로 Microsoft OS의 가짜 소프트웨어에 의해 실수로 추가됩니다.
dos2unix
그것을 제거하고 Windows 텍스트 파일의 다른 특성을 돌볼 것입니다.
dos2unix test.xml
dos2unix
있습니까?
다음 tail
명령 을 사용하여 파일에서 BOM을 제거 할 수 있습니다 .
tail -c +4 withBOM.txt > withoutBOM.txt
tail
1 기반 인덱싱을 사용하고 있습니까?! 이런 씨발!
tail -c -1
또는은 tail -c 1
(어떤 tail
일반적으로 사용된다)의 마지막 바이트로 시작하는 컨텐츠 인 tail -c +1
첫번째 바이트부터 시작. tail -c 0
/ tail -c +0
그게 훨씬 더 직관적이 될 것이기 때문.
(dd bs=1 count=3 of=/dev/null; cat) <input >output
. 또는 (head -c3 >/dev/null; cat)
UTF8 또는 기타 비 싱글 바이트 로케일에서도 GNU를 사용합니다 . GNU 헤드는 'char'= byte를 수행합니다.
당신이 사용할 수있는
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
파일의 시작 부분에서 바이트 순서 표시를 제거하고 CR LF 개행을 LF로만 변환합니다. 이 LANG=C LC_ALL=C
명령은 쉘이 명령을 기본 C 로케일 (기본 POSIX 로케일이라고도 함)에서 실행하도록하는데, 여기서 바이트 순서 마크를 형성하는 3 바이트는 바이트로 처리됩니다. -i
나오지하는 옵션에 적절한 의미한다. 을 사용하는 경우 -i.old
sed는 원본 파일을으로 저장 filename.old
하고 새 파일 (있는 경우 수정 사항이있는 경우)을으로 저장 filename
합니다.
나는 개인적으로 이것을 이것을 좋아합니다 ~/bin/fix-ms
. 예를 들어
#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
for FILE in "$@" ; do
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
done
else
exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi
모든 C 소스 파일과 헤더 (예 : MS-DOS 시대의 오래된 코드)를 말하기 위해 이것을 적용 해야하는 경우, 나는 단지 실행합니다.
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
또는 수정하지 않고 그러한 파일을보고 싶다면 실행할 수 있습니다.
~/bin/ms-fix < filename | less
<U+FEFF>
UTF-8 터미널에서 못 생겼 습니다.
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
않습니까?
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
. 종료 코드를 리턴하지만 종료하기 전에 인수 목록에 나열된 모든 파일을 처리합니다.
--
파일 이름 이전은 물론 중요합니다. 파일 이름없이 대시로 시작하는 파일 이름은 sed에 의해 옵션으로 간주 될 수 있습니다. 나는 그것들을 나의 대답으로 편집했다. 알림 주셔서 감사합니다!
최근에 임의의 UTF-8 인코딩 파일에서 BOM을 추가하거나 제거하는이 작은 명령 줄 도구를 찾았습니다. UTF BOM 유틸리티 ( github의 새 링크 )
약간의 단점은 일반 C ++ 소스 코드 만 다운로드 할 수 있다는 것입니다. makefile ( 예 : CMake 사용 )을 작성하고 직접 컴파일해야합니다.이 페이지에는 바이너리가 제공되지 않습니다.