У меня есть текстовый файл с двумя байтами, отличными от ascii (0xFF и 0xFE):
??58832520.3,ABC
348384,DEF
Гекс для этого файла:
FF FE 35 38 38 33 32 35 32 30 2E 33 2C 41 42 43 0A 33 34 38 33 38 34 2C 44 45 46
По совпадению FF и FE оказываются ведущими байтами (они существуют по всему моему файлу, хотя, по-видимому, всегда в начале строки).
Я пытаюсь удалить эти байты с помощью sed, но ничего, что я делаю, похоже, не соответствует им.
$ sed 's/[^a-zA-Z0-9\,]//g' test.csv
??588325203,ABC
348384,DEF
$ sed 's/[a-zA-Z0-9\,]//g' test.csv
??.
Основной вопрос: как мне удалить эти байты?
Дополнительный вопрос: два приведенных выше регулярных выражения являются прямыми отрицаниями, поэтому один из них должен логически отфильтровать эти байты, верно? Почему оба этих регулярных выражения совпадают с байтами 0xFF и 0xFE?
Обновление : прямой подход к удалению диапазона шестнадцатеричного байта (предложенный двумя ответами ниже), кажется, удаляет первый «допустимый» байт из каждой строки и оставляет те байты, которые я пытаюсь избавиться от:
$sed 's/[\x80-\xff]//' test.csv
??8832520.3,ABC
48384,DEF
FF FE 38 38 33 32 35 32 30 2E 33 2C 41 42 43 0A 34 38 33 38 34 2C 44 45 46 0A
Обратите внимание на пропущенные «5» и «3» в начале каждой строки, а новый 0A добавлен в конец файла.
Большое обновление : Эта проблема связана с системой. Проблема наблюдалась в OSX, но предложения (включая мое первоначальное утверждение sed выше) работают, как я ожидаю, в NetBSD.
Решение : Эта та же задача кажется достаточно простой через Perl:
$ perl -pe 's/^\xFF\xFE//' test.csv
58832520.3,ABC
348384,DEF
Однако я оставлю этот вопрос открытым, так как это всего лишь обходной путь, и не объясняет, в чем проблема с sed.