Próbuję napisać skrypt, który automatycznie usunie BOM z UTF-8 z pliku. Mam problem z wykryciem, czy plik ma pierwszeństwo, czy nie. Tu jest mój kodu:Jak wykryć, czy plik ma BOM UTF-8 w Bash?
function has-bom {
# Test if the file starts with 0xEF, 0xBB, and 0xBF
head -c 3 "$1" | grep -P '\xef\xbb\xbf'
return $?
}
Z jakiegoś powodu, head
wydaje się być ignorowanie LM przed pliku. Na przykład, uruchomienie tego nie będzie niczego drukować.
Próbowałem szukać opcji w head --help
, która pozwoliłaby mi obejść to, ale bez powodzenia. Czy jest coś, co mogę zrobić, aby to zadziałało?
Huh, nigdy nie wiedziałem, że Bash obsługuje ciągi liter szesnastkowych. W każdym razie, dzięki za wspaniałą odpowiedź! –
cześć, mogę zapytać w wierszu 'head -c 3 file | hexdump -c ', co robi' -c'?Wydaje się, że poprzednia 1) ograniczenie liczby znaków wyjściowych 2) ograniczyć liczbę linii (być może) do 0000000 i 0000003; ale ta ostatnia sprawia, że wyjście, które ma być "be bf" itp., na marker zastępczy. Używam bash i testing na pliku tekstowym wygenerowanym pod Windows, oryginalne kodowanie = GB18030. Dzięki. – CrazyFrog
@ CrazyFrog 'head -c 3 file' zapisuje pierwsze trzy znaki' file' na standardowe wyjście. 'hexdump -C' formatuje te znaki w przyjazny dla człowieka sposób w postaci szesnastkowej. – John1024