วิธีจะawk
สคริปต์ (สันนิษฐานหนึ่งซับ) ถอดBOMมีลักษณะเหมือน?
ข้อมูลจำเพาะ:
- พิมพ์ทุกบรรทัดหลังจากแรก (
NR > 1
) - สำหรับบรรทัดแรก: หากขึ้นต้นด้วย
#FE #FF
หรือ#FF #FE
ให้ลบออกและพิมพ์ส่วนที่เหลือ
วิธีจะawk
สคริปต์ (สันนิษฐานหนึ่งซับ) ถอด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
เป็นเงื่อนไขที่สั้นที่สุดที่ประเมินเป็นจริงเสมอดังนั้นแต่ละเร็กคอร์ดจึงถูกพิมพ์ออกมา
สนุก!
- เพิ่มเติม -
คำถามที่พบบ่อย Unicode Byte Order Mark (BOM)ประกอบด้วยตารางต่อไปนี้ที่แสดงรายการ 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 จากตารางด้านบนอย่างไร
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
และตรวจสอบให้แน่ใจว่า INFILE และ OUTFILE แตกต่างกัน!
perl -i.orig -pe 's/^\x{FFFE}//' badfile
คุณสามารถพึ่งพา PERL_UNICODE และ / หรือ PERLIO ของคุณสำหรับการเข้ารหัส PERL_UNICODE = SD ใช้ได้กับ UTF-8; สำหรับคนอื่น ๆ คุณต้องมี PERLIO
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
การใช้ 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
ไม่ได้กล่าวถึงการรองรับการหลบหนีเลขฐานสิบหก\xef
Ala
เคล็ดลับที่คล้ายกันนี้สามารถทำได้กับโปรแกรมใด ๆ โดยไปที่sponge
เครื่องมือจากmoreutils :
awk '…' INFILE | sponge INFILE
10.11.6
ไม่ได้ผล แต่คำตอบอย่างเป็นทางการstackoverflow.com/a/1068700/9636 ใช้งานได้ดี
ไม่แย่ แต่ง่ายกว่า:
tail -c +4 UTF8 > UTF8.nobom
ในการตรวจสอบ BOM:
hd -n 3 UTF8
หากมี BOM คุณจะเห็น: 00000000 ef bb bf ...
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
จะหัก ห้ามใช้ BOM บน UTF-8 ระยะเวลา
hd
ไม่สามารถใช้งานบน OS X ( ณ วันที่ 10.8.2) ดังนั้นในการตรวจสอบ UTF-8 BOM head -c 3 file | od -t x1
มีคุณสามารถใช้ต่อไปนี้:
นอกจากการแปลงส่วนท้ายบรรทัด CRLF เป็น LF แล้วdos2unix
ยังลบ BOM ด้วย:
dos2unix *.txt
dos2unix
ยังแปลงไฟล์ UTF-16 ด้วย BOM (แต่ไม่ใช่ไฟล์ UTF-16 ที่ไม่มี BOM) เป็น UTF-8 โดยไม่มี BOM:
$ 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 ที่ท้าทาย (บน windows พร้อม UI)
ฉันพบปัญหาเดียวกันในโครงการ WordPress (BOM ทำให้เกิดปัญหากับฟีด rss และการตรวจสอบความถูกต้องของเพจ) และฉันต้องตรวจสอบไฟล์ทั้งหมดในแผนผังไดเรกทอรีที่ค่อนข้างใหญ่เพื่อค้นหาไฟล์ที่อยู่กับ BOM พบแอปพลิเคชันชื่อReplace Pioneerและอยู่ในนั้น:
Batch Runner -> Search (เพื่อค้นหาไฟล์ทั้งหมดในโฟลเดอร์ย่อย) -> Replace Template -> Binary ลบ BOM (มีการค้นหาสำเร็จรูปและแทนที่เทมเพลตสำหรับสิ่งนี้)
มันไม่ใช่วิธีแก้ปัญหาที่หรูหราที่สุดและต้องติดตั้งโปรแกรมซึ่งเป็นข้อเสีย แต่เมื่อฉันพบว่าเกิดอะไรขึ้นรอบตัวฉันมันใช้งานได้อย่างมีเสน่ห์ (และพบ 3 ไฟล์จากประมาณ 2300 ที่อยู่กับ BOM)