2017-01-17 5 views
0

Я получаю нежелательные символы (<9f>, <9d>, <9d> и т.д.), CNTRL символы (^Z, ^M и т.д.) и NULL символов (^@) в файле. Однако мне удалось удалить CNTRL и NULL символов из файла, но не удалось устранить ненужные символы. Может ли кто-нибудь предложить способ удалить эти хлам?Удалить ненужные символы из файла UTF-8 в Unix

Screen shot for Junk Data

Управляющие символы удаляются с помощью следующей команды:

sed 's/\x1a//g;s/\xef\xbf\xbd//g' 

Нулевые символы удаляются с помощью следующей команды

tr -d '\000' 

Кроме того, ублажать предложить единую команду удалите все вышеупомянутые 3 типа символов garbal.

Заранее спасибо

+0

Dos2Unix также не работает. проблемы с ошибками в преобразовании файла ' – user2975559

+0

в какой кодировке является файл? Можете ли вы вставить файл на pastebin.com? – hansaplast

+0

кодировка файла - utf-8. Извините, я не мог поместить файл. – user2975559

ответ

1

Газа «необычный» Юникод

В комментариях вы упоминаете, что вы хотите, чтобы блокировать управляющие символами, сохраняя при этом греческие символы, так что решение ниже с тр не подходит. Одним из решений является sed, который предлагает поддержку юникода, а их классы [[:alpha:]] соответствуют также алфавитным символам за пределами ascii. Сначала вам нужно установить LC_CTYPE, чтобы указать, какие персонажи попадают в диапазон [[:alpha:]]. Для немецкого языка с Umlauts это, например,

LC_CTYPE=de_DE.UTF-8 

Затем вы можете использовать sed вырезать все, что не является буквой или пунктуации:

sed 's/[^[:alpha:];\ [email protected]]//g' < junk.txt 

Что \ [email protected] делает: Он соответствует всем символам в диапазоне ASCii между пространством и @ (см ascii table Sed имеет класс [[:punct:]], но, к сожалению, это также соответствует большому количеству мусора, поэтому требуется \ [email protected].

Возможно, вам придется немного поиграть с LC_CTYPE, установив его на utf-8 только я мог соответствовать греческим персонажам, но не японским.

Если вы заботитесь только о ASCII

Если вы только заботиться о регулярных символов ASCII вы можете использовать tr: сначала преобразовать файл в «один байт на символ» кодировке, так как tr не понимает многобайтные символы, например используя iconv.

Затем я бы посоветовал использовать белый список (в отличие от подхода черного списка, который у вас есть в вашем вопросе), поскольку гораздо проще указать, что вы хотите сохранить, чем то, что вы хотите отфильтровать.

Эта команда должна сделать:

iconv -c -f utf-8 -t latin1 < junk.txt | tr -cd '\11\12\40-\176' 

эта линия ..

  • преобразуется в latin1 (один байт на голец) и игнорирует все символы выше элемент коды 127 (которые являются специальными символами, но быть в курсе, что отсекает также такие вещи, как Умляут или специальных символы в вашем языке, которые вы могли бы хотеть держать!)
  • удаляет все символы, находящиеся за пределами этого белого списка: \11\12\40-\176. Числа там восьмеричные. Посмотрите, например. this ascii table. \11 есть tab, \12 есть возвращение денег. \40-\176 - все символы, которые обычно считаются «нормальными»
+0

Спасибо за предложение. Я уже использовал эту команду tr -cd '\ 11 \ 12 \ 40- \ 176'. Все ненужные символы удалены. Тем не менее, я теряю некоторые греческие персонажи. Мне нужны эти греческие символы – user2975559

+0

А также, если я конвертирую файл из utf-8 в us-latin с помощью iconv, я теряю все символы Unicode, такие как данные в Японии, греческие данные – user2975559

+0

@ user2975559 Я расширил свой ответ, чтобы также совместить символы Юникода помимо набора ascii, можете ли вы проверить, разрешает ли это вашу проблему? – hansaplast

Смежные вопросы