Существует ли путь к grep папка, и покажите все строки, содержащие символы неASCII?

cd ~/.cache/sessions/; rm -r * с последующим перевходом в систему, решенным проблема.

3
01.04.2015, 02:39
4 ответа

Поиск символов, отличных от 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
2
27.01.2020, 21:19

Попробуйте следующее:

grep '[^[:print:][:space:]]'

(в зависимости от настройки локали, может быть, вам придется добавить его Lang = C .)

1
27.01.2020, 21:19

Если вы не против использования 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}/' {} \;
1
27.01.2020, 21:19

Мои файлы были закодированы в 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".

0
27.01.2020, 21:19

Теги

Похожие вопросы