Tôi đang cố gắng viết một tập lệnh sẽ tự động xóa các BOM UTF-8 khỏi một tệp. Tôi gặp sự cố khi phát hiện xem tệp có ở vị trí đầu tiên hay không. Đây là mã của tôi:Làm thế nào để phát hiện xem tệp có một UTF-8 BOM trong Bash không?
function has-bom {
# Test if the file starts with 0xEF, 0xBB, and 0xBF
head -c 3 "$1" | grep -P '\xef\xbb\xbf'
return $?
}
Đối với một số lý do, head
dường như bị bỏ qua BOM ở phía trước của tập tin. Ví dụ: chạy số này
printf '\xef\xbb\xbf' > file
head -c 3 file
sẽ không in bất kỳ thứ gì.
Tôi đã thử tìm kiếm một tùy chọn trong head --help
để tôi có thể làm việc này, nhưng không may mắn. Tôi có thể làm gì để thực hiện công việc này không?
Huh, không bao giờ biết Bash hỗ trợ chuỗi ký tự hex. Dù sao, cảm ơn cho câu trả lời tuyệt vời! –
hi, tôi có thể hỏi trong dòng 'head -c 3 file | hexdump -c ',' -c' làm gì?Cái trước có vẻ là 1) giới hạn số ký tự đầu ra 2) giới hạn số dòng (có thể) đến 0000000 và 0000003; nhưng sau đó làm cho đầu ra, được cho là "được bf" vv, vào điểm đánh dấu thay thế. Tôi đang sử dụng bash và thử nghiệm trên một tập tin văn bản được tạo ra trong Windows, mã hóa ban đầu = GB18030. Cảm ơn. – CrazyFrog
@CrazyFrog 'head -c 3 file' ghi ba ký tự đầu tiên của' tệp' thành tiêu chuẩn. 'hexdump -C' định dạng những ký tự đó theo cách thân thiện với con người dưới dạng thập lục phân. – John1024