Использование awk для удаления метки порядка байтов
как бы awk скрипт (предположительно однострочный) для удаления BOM выглядеть?
спецификация:
- печатать каждую строку после первой (
NR > 1) - для первой строки: если он начинается с
#FE #FFили#FF #FE, удалите их и распечатайте остальные
5 ответов:
попробуйте это:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILEв первой записи (строке) удалите символы спецификации. Распечатайте каждую запись.
или немного короче, используя знание того, что действие по умолчанию в awk заключается в печати записи:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1является самым коротким условием, которое всегда оценивается как true, поэтому каждая запись печатается.наслаждайтесь!
-- дополнения --
Unicode Byte Order Mark (BOM) FAQ включает в себя следующую таблицу, в которой перечислены точные байты спецификации для каждой кодировки:
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 BFUTF-8байты спецификации из приведенной выше таблицы.
С помощью 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: the С moreutils:awk '…' INFILE | sponge INFILE
не awk, но проще:
tail -c +4 UTF8 > UTF8.nobomдля проверки спецификации:
hd -n 3 UTF8Если BOM присутствует вы увидите:
00000000 ef bb bf ...
в дополнение к преобразованию окончаний строк CRLF в LF,
dos2unixтакже удаляет спецификации: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-challenged (на windows, с пользовательским интерфейсом).
Я столкнулся с той же проблемой в проекте WordPress (BOM вызывал проблемы с RSS-каналом и проверкой страницы), и мне пришлось заглянуть во все файлы в довольно большом дереве каталогов, чтобы найти тот, который был с BOM. Нашел приложение под названием Заменить Pioneer а это:Batch Runner -> поиск (чтобы найти все файлы в подпапках) - > заменить шаблон - > Binary remove BOM (для этого есть готовый поиск и замена шаблона).
Это не самое элегантное решение и требуют установки программы, что является недостатком. Но как только я узнал, что происходит вокруг меня, это сработало как шарм (и нашел 3 файла из примерно 2300, которые были с BOM).
Comments