Sto provando a scrivere uno script che rimuoverà automaticamente i BOM UTF-8 da un file. Sto riscontrando problemi nel rilevare se il file ne ha uno al primo posto oppure no. Ecco il mio codice:Come rilevare se un file ha un BOM UTF-8 in Bash?
function has-bom {
# Test if the file starts with 0xEF, 0xBB, and 0xBF
head -c 3 "$1" | grep -P '\xef\xbb\xbf'
return $?
}
Per qualche ragione, head
sembra ignorare la distinta di fronte al file. Ad esempio, l'esecuzione di questo
printf '\xef\xbb\xbf' > file
head -c 3 file
non stampa nulla.
Ho provato a cercare un'opzione in head --help
che mi permettesse di aggirare questo problema, ma senza fortuna. C'è qualcosa che posso fare per farlo funzionare?
Eh, non ho mai saputo che Bash supportava letterali stringa esadecimale. Comunque, grazie per l'ottima risposta! –
ciao, posso chiedere in linea 'head -c 3 file | hexdump -c ', cosa fa il' -c'?Il precedente sembra 1) limitare il numero di caratteri in uscita 2) limitare il numero di linea (forse) a 0000000 e 0000003; ma quest'ultimo rende l'output, che dovrebbe essere "be bf" ecc., nel marker di sostituzione. Sto usando bash e test su un file di testo generato in Windows, codifica originale = GB18030. Grazie. – CrazyFrog
@CrazyFrog 'head -c 3 file' scrive i primi tre caratteri di' file' come standard. 'hexdump -C' formatta quei caratteri in modo umano come esadecimale. – John1024