Удалить ненужные символы из файла utf-8 в Unix

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

Снимок экрана для нежелательных данных

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

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

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

tr -d '\000'

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

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


person user2975559    schedule 17.01.2017    source источник
comment
Dos2Unix тоже не работает. ошибка гласит «проблемы с преобразованием файла»   -  person user2975559    schedule 17.01.2017
comment
в какой кодировке файл? Можете ли вы вставить файл на pastebin.com?   -  person hansaplast    schedule 17.01.2017
comment
кодировка файла utf-8. Извините, я не смог разместить файл.   -  person user2975559    schedule 17.01.2017


Ответы (1)


Удалите «необычные» символы Юникода

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

LC_CTYPE=de_DE.UTF-8

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

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

Что делает \ -@: он сопоставляет все символы в диапазоне ascii между пробелом и @ (см. таблицу ascii). a [[:punct:]] , но, к сожалению, он также соответствует большому количеству мусора, поэтому необходим \ -@.

Возможно, вам придется немного поиграть с 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. Числа там восьмеричные. Посмотрите, например. эту таблицу ascii. \11 это tab, \12 это возврат каретки. \40-\176 — это все символы, которые обычно считаются «нормальными».
person hansaplast    schedule 17.01.2017
comment
Спасибо за предложение. Я уже использовал эту команду tr -cd '\11\12\40-\176'. Все ненужные персонажи удалены. Однако я также теряю некоторые греческие символы. Мне нужны эти греческие символы - person user2975559; 17.01.2017
comment
А также, если я конвертирую файл из utf-8 в us-latin с помощью iconv, я теряю все символы Unicode, такие как данные Японии, данные Греции - person user2975559; 17.01.2017
comment
@user2975559 user2975559 Я расширил свой ответ, чтобы он также соответствовал символам Юникода за пределами набора ascii, можете ли вы проверить, решает ли это вашу проблему? - person hansaplast; 18.01.2017