(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"?
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.**
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!
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.
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.
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ł.
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 .
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.
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]+
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