(grep) Regex, щоб відповідати символам, що не належать до ASCII?


169

В Linux у мене каталог з великою кількістю файлів. Деякі з них мають символи, що не належать до ASCII, але всі вони є дійсними UTF-8 . Одна програма має помилку, яка заважає їй працювати з іменами, що не належать до ASCII, і я маю з’ясувати, на скільки це впливає. Я збирався зробити це за допомогою, findа потім зробити греп, щоб надрукувати символи, що не належать до ASCII, а потім зробити а, wc -lщоб знайти номер. Це не повинно бути грепом; Я можу використовувати будь-який стандартний регулярний вираз Unix , наприклад Perl , sed , AWK тощо.

Однак, чи є регулярний вираз "будь-який символ, який не є символом ASCII"?


1
Пол, так, я можу використовувати perl
Rory

/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Tinmarino

Відповіді:


310

Це відповідатиме одному символу, що не належить до ASCII:

[^\x00-\x7F]

Це дійсний PCRE ( Perl-Compatible Regular Expression ).

Ви також можете використовувати скорочення POSIX :

  • [[:ascii:]] - відповідає одному знаку ASCII
  • [^[:ascii:]] - відповідає одному знаку, що не належить до ASCII

[^[:print:]] вам, ймовірно, вистачить **.


3
@adrianm: Ні, ^діє в PCRE.
Алікс Аксель

10
Це точно так. Однак ви повинні використовувати pcregrep, а не стандартний grep. [^ [: print:]] не працюватиме, якщо ваш термінал встановлений в UTF8.
Рорі

@ Rory, чому :print:не працює в терміналі UTF8? Це працює для мене в підпілці в терміналі UTF8:27.chr =~ /[^[:print:]]/
akostadinov

Це дуже добре для виправлення поганих імен файлів - rename 's/[^\x00-\x7F]//g' *(ви можете -nспочатку перевірити перейменування).
naught101

Як я можу зіставити будь-який символ, який не є UTF8, та будь-які інші конкретні символи?
CMCDragonkai

37

Ні, [^\x20-\x7E]не ASCII.

Це справжній ASCII:

 [^\x00-\x7F]

Інакше він обріже нові рядки та інші спеціальні символи, що входять до таблиці ASCII!



3

[^\x00-\x7F]і [^[:ascii:]]пропустіть кілька байтів управління, тому рядки можуть бути кращим варіантом. Наприклад cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g', зробить дивні речі на своєму терміналі, де як strings test.torrentбуде вести себе.


3

Для перевірки текстового поля Прийміть Ascii, використовуйте лише цей шаблон

[\x00-\x7F]+



2

Ви можете використовувати цей регулярний вираз:

[^\w \xC0-\xFF]

Запитуйте випадок, варіанти - Multiline .


2

Вам не дуже потрібен регулярний вираз.

printf "%s\n" *[!\ -~]*

Це покаже імена файлів із контрольними символами у своїх іменах теж, але я вважаю це функцією.

Якщо у вас немає відповідних файлів, глобус розшириться лише до себе, якщо ви не nullglobвстановили. (Вираз не відповідає собі, тому технічно цей вихід є однозначним.)


Запізнився, я можу зауважити , що це робить роботу правильно , якщо ви на самому справі є деякі файли , які відповідають цим шаблоном. Поведінка, коли візерунок друкує себе, коли немає відповідностей, трохи дивує, але насправді правильний. Я відредагував відповідь, щоб сподіватися прояснити це.
трійчатка

1

Це виявилося дуже гнучким та розтяжним. $ field = ~ s / [^ \ x00- \ x7F] // g; # таким чином, всі не ASCII або конкретні питання, про які йдеться, можна було очистити Дуже приємно або в підборі, або попередній обробці предметів, які з часом стануть хеш-ключами.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.