cd ~/.cache/sessions/; rm -r *
с последующим перевходом в систему, решенным проблема.
Поиск символов, отличных от ASCII, прост: установите языковой стандарт, в котором допустимы только символы ASCII, выполните поиск недопустимых символов.
LC_CTYPE=C grep '[^[:print:]]' myfile
Если вы хотите найти японские иероглифы, это немного сложнее. С помощью grep вам необходимо убедиться, что ваш языковой стандарт LC_CTYPE
соответствует кодировке файлов. Вам также необходимо убедиться, что для параметра LC_COLLATE
задан японский язык, если вы хотите использовать выражение диапазона символов. Например, в Linux (я определил первый и последний символ, который считается японским, просмотрев раздел LC_COLLATE
/ usr / share / i18n / locales / ja_JP
):
LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep '[。-龥]' myfile
или если вы хотите придерживаться ASCII в своем скрипте
LC_CTYPE=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8 egrep $'[\uff61-\u9fa5]' myfile
Сюда входят несколько знаков препинания, которые также используются в английском языке, например ⓒ
и ×
.
Perl имеет встроенные функции для классификации символов. Вы можете использовать класс символов \ p
для сопоставления символов на основе свойств Unicode . Передайте ключ командной строки -CSD
, чтобы сообщить Perl, что все находится в Unicode с кодировкой UTF-8.
perl -CSD -ne 'print if /\p{Hiragana}|\p{Katakana}/' myfile
Если ваши файлы не закодированы в UTF-8, вам придется явно вызвать binmode
, чтобы сообщить Perl об их кодировке. Для меня это слишком сложное использование perllocale .В качестве альтернативы вы можете сначала перекодировать строку в UTF-8 .
В качестве альтернативы в Perl вы можете использовать диапазоны числовых символов. Например, для поиска символов в блоках Unicode хирагана и катакана:
perl -CSD -ne 'print if /[\x{3040}-\x{30ff}]/' a
Попробуйте следующее:
grep '[^[:print:][:space:]]'
(в зависимости от настройки локали, может быть, вам придется добавить его Lang = C
.)
Если вы не против использования Perl, он имеет более обширную поддержку Unicode в виде классов, таких как {Катакана}
и {Hiragana }
, которые я не думаю, в настоящее время доступны даже в этих версиях GREP, которые обеспечивают некоторую поддержку PCRE. Однако он, по-видимому, требует явного декодирования UTF-8 E.G.
perl -MEncode -ne 'print if decode("UTF-8",$_) =~ /\p{Hiragana}/' somefile
Для пересечения каталогов, таких как GreeP -R, вы можете использовать команду Find
, что-то вроде
find -type f -exec perl -MEncode -ne 'print if decode("UTF-8",$_) =~ /\p{Hiragana}/' {} \;
или для имитирования рекурсивного по умолчанию GreeP : Match
Формат выхода ,
find -type f -exec perl -MEncode -lne 'printf "%s:%s\n",$ARGV,$_ if decode("UTF-8",$_) =~ /\p{Hiragana}/' {} \;
Мои файлы были закодированы в iso-8859-1, так что все, что пыталось прочитать входные данные в моей стандартной локали (utf-8), не распознало бы японские символы. В конце концов, мне удалось решить свою проблему с помощью следующей команды:
env LC_CTYPE=iso-8859-1 grep -nP '[\x80-\xff]' ./*
-P - это разрешить синтаксис Perllike для диапазонов символов.
-n для печати номеров строк рядом с именами строк
\x80
до \xff
- это символы "non ascii"
Изменение переменной окружения LC_CTYPE на iso-8859-1 заставляет grep читать мои поля байт-байт и позволяет мне обнаружить любые "расширенные ascii" байты как возможные японские символы. Если я использую системную кодировку по умолчанию UTF-8 grep выходит с ошибкой "invalid UTF-8 byte sequence in input".