(grep) Regex do dopasowania znaków innych niż ASCII?

Na Linuksie mam katalog z mnóstwem plików. Niektóre z nich mają znaki inne niż ASCII, ale wszystkie są poprawne UTF-8 . JEDEN program ma błąd, który uniemożliwia mu pracę z nazwami plików innych niż ASCII, i muszę się dowiedzieć, ile ich dotyczy. Miałem zamiar zrobić to za pomocą find, a następnie wykonać grep, Aby wydrukować znaki spoza ASCII, a następnie wykonać wc -l, aby znaleźć numer. Nie musi to być grep; mogę użyć dowolnego standardowego Unix wyrażenia regularnego , Jak Perl, sed, AWK , itd.

Jednak, czy istnieje wyrażenie regularne dla "każdy znak, który nie jest znakiem ASCII"?

Author: Peter Mortensen, 2010-01-23

8 answers

To będzie pasować do pojedynczego znaku nie-ASCII:

[^\x00-\x7F]

To jest poprawne PCRE (Wyrażenie regularne zgodne z Perlem ).

Możesz również użyć skrótów POSIX :

  • [[:ascii:]] - dopasowuje pojedynczy znak ASCII
  • [^[:ascii:]] - dopasowuje pojedynczy znak nie-ASCII

[^[:print:]] pewnie ci wystarczy.**

 237
Author: Alix Axel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-11 13:02:25

Nie, [^\x20-\x7E] nie jest ASCII.

To jest prawdziwe ASCII:

 [^\x00-\x7F]

W przeciwnym razie przycina nowe linie i inne znaki specjalne, które są częścią tabeli ASCII!

 30
Author: Peter L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-11 13:04:02

Możesz również sprawdzić tę stronę: wyrażenia regularne Unicode , ponieważ zawiera kilka przydatnych klas znaków Unicode, takich jak:

\p{Control}: an ASCII 0x00..0x1F or Latin-1 0x80..0x9F control character.
 4
Author: Rubens Farias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-23 18:58:25

Tak naprawdę nie potrzebujesz wyrażenia regularnego.

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

Wyświetli również nazwy plików ze znakami kontrolnymi w ich nazwach, ale uważam, że jest to funkcja.

Jeśli nie masz pasujących plików, glob rozszerzy się do zera.

 1
Author: tripleee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-28 12:04:51

[^\x00-\x7F] i [^[:ascii:]] brakuje niektórych bajtów sterujących, więc ciągi mogą być czasami lepszą opcją. Na przykład {[2] } zrobi dziwne rzeczy z Twoim terminalem, gdzie as strings test.torrent będzie się zachowywał.

 1
Author: user1133275,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 03:53:46

Możesz użyć tego wyrażenia regularnego:

[^\w \xC0-\xFF]

Case ask, opcje to Multiline .

 0
Author: CypherPotato,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-23 00:17:01

Okazało się to bardzo elastyczne i rozciągliwe. $field = ~ s/[^\x00-\x7f]/ / g ; # tak więc wszystkie Nie ASCII lub konkretne elementy mogą zostać wyczyszczone. Bardzo ładne albo w wyborze lub wstępnego przetwarzania elementów, które ostatecznie staną się hash keys.

 0
Author: Don Turnblade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-19 20:25:07

Aby zweryfikować pole tekstowe Accept Ascii użyj tylko tego wzorca

[\x00-\x7F]+

 0
Author: Othman Mahmoud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 19:28:33