바이트 주문 마크를 제거하기 위해 awk를 사용합니다
-
21-08-2019 - |
문제
어떻게 awk
a를 제거하기위한 스크립트 (아마도 1 라이너) BOM 봐요?
사양:
- 첫 번째 후에 모든 줄을 인쇄하십시오 (
NR > 1
) - 첫 번째 줄 : 시작하면
#FE #FF
또는#FF #FE
, 그것들을 제거하고 나머지를 인쇄하십시오
해결책
이 시도:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
첫 번째 레코드 (줄)에서 BOM 문자를 제거하십시오. 모든 레코드를 인쇄하십시오.
또는 AWK의 기본 동작이 레코드를 인쇄하는 것이라는 지식을 사용하여 약간 짧습니다.
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
항상 true로 평가되는 가장 짧은 조건이므로 각 레코드가 인쇄됩니다.
즐기다!
-- 부록 --
유니 코드 바이트 주문 마크 (BOM) FAQ 각 인코딩에 대한 정확한 BOM 바이트를 나열하는 다음 표를 포함합니다.
Bytes | Encoding Form
--------------------------------------
00 00 FE FF | UTF-32, big-endian
FF FE 00 00 | UTF-32, little-endian
FE FF | UTF-16, big-endian
FF FE | UTF-16, little-endian
EF BB BF | UTF-8
따라서 방법을 알 수 있습니다 \xef\xbb\xbf
대응합니다 EF BB BF
UTF-8
위 표에서 BOM 바이트.
다른 팁
GNU 사용 sed
(Linux 또는 Cygwin에서) :
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
freebsd :
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
GNU 또는 FreeBSD 사용의 장점 sed
: -i
매개 변수는 "제자리에"를 의미하며 리디렉션이나 이상한 트릭없이 파일을 업데이트합니다.
Mac :
이것 awk
솔루션은 다른 답변에서 작동합니다, 하지만 sed
위의 명령은 작동하지 않습니다. 적어도 Mac (Sierra) sed
문서는 16 진수에 이스케이프 ALA를 지원하는 것을 언급하지 않습니다 \xef
.
모든 프로그램에서도 비슷한 트릭을 달성 할 수 있습니다. sponge
도구 더 많은 사람들:
awk '…' INFILE | sponge INFILE
어색하지는 않지만 더 간단한 :
tail -c +4 UTF8 > UTF8.nobom
BOM을 확인하려면 :
hd -n 3 UTF8
BOM이 있으면 다음을 볼 수 있습니다. 00000000 ef bb bf ...
CRLF 라인 엔딩을 LF로 변환하는 것 외에도 dos2unix
BOM도 제거합니다.
dos2unix *.txt
dos2unix
또한 BOM없이 UTF-16 파일 (BOM이없는 UTF-16 파일은 아님)으로 UTF-16 파일을 BOM없이 UTF-8로 변환합니다.
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
$ printf '\ufeffä\n'>bom-utf8
$ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
$ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
$ printf 'ä\n'>utf8
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be feff00e4000a
bom-utf16le fffee4000a00
bom-utf8 efbbbfc3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
$ dos2unix -q *
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be c3a40a
bom-utf16le c3a40a
bom-utf8 c3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
나는이 질문이 Unix/Linux를 향한 것으로 알고 있으며, UNIX-Challeded (UI와 함께 Windows에서)에 대한 좋은 옵션을 언급 할 가치가 있다고 생각했습니다.
WordPress 프로젝트에서 동일한 문제를 겪었고 (BOM은 RSS 피드 및 페이지 검증에 문제를 일으켰습니다) BOM과 함께있는 파일을 찾기 위해 매우 큰 디렉토리 트리의 모든 파일을 조사해야했습니다. 호출되는 응용 프로그램을 찾았습니다 개척자를 교체하십시오 그리고 그것에 :
배치 러너 -> 검색 (서브 폴더에서 모든 파일을 찾으려면) -> 템플릿 교체 -> BAINE BANIER RE -BONID BOM (준비된 검색 및 교체 템플릿이 있습니다).
가장 우아한 솔루션이 아니었고 프로그램을 설치해야했습니다. 그러나 일단 내 주위에 무슨 일이 일어나고 있는지 알게되면 매력처럼 작동했습니다 (그리고 Bom과 함께있는 약 2300 명 중 3 개의 파일을 찾았습니다).