W systemie Linux mam katalog z dużą ilością plików. Niektóre z nich mają znaki spoza ASCII, ale wszystkie są poprawnymi kodami UTF-8 . Jeden program ma błąd, który uniemożliwia mu pracę z nazwami plików spoza ASCII i muszę dowiedzieć się, na ilu z nich ma to wpływ. Zamierzałem to zrobić, find
a następnie wykonać polecenie grep, aby wydrukować znaki spoza ASCII, a następnie zrobić, wc -l
aby znaleźć liczbę. Nie musi to być grep; Mogę użyć dowolnego standardowego wyrażenia regularnego Unix , takiego jak Perl , sed , AWK itp.
Czy jednak istnieje wyrażenie regularne dla „dowolnego znaku, który nie jest znakiem ASCII”?
/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Odpowiedzi:
Dopasuje to pojedynczy znak spoza zestawu ASCII:
To jest poprawne PCRE ( wyrażenie regularne zgodne z Perlem ).
Możesz także użyć skrótów POSIX :
[[:ascii:]]
- dopasowuje pojedynczy znak ASCII[^[:ascii:]]
- dopasowuje pojedynczy znak inny niż ASCII[^[:print:]]
prawdopodobnie wystarczy. **źródło
^
obowiązuje w PCRE.:print:
nie działa w terminalu UTF8? To działa dla mnie w27.chr =~ /[^[:print:]]/
rename 's/[^\x00-\x7F]//g' *
(możesz najpierw-n
sprawdzić, czy zmiany są prawidłowe).Nie,
[^\x20-\x7E]
to nie jest ASCII.To jest prawdziwy ASCII:
W przeciwnym razie usunie nowe linie i inne znaki specjalne, które są częścią tabeli ASCII!
źródło
Możesz również sprawdzić tę stronę: Wyrażenia regularne Unicode , ponieważ zawiera kilka przydatnych klas znaków Unicode, takich jak:
źródło
[^\x00-\x7F]
i[^[:ascii:]]
pomijają niektóre bajty sterujące, więc ciągi znaków mogą być czasami lepszą opcją. Na przykładcat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'
zrobi dziwne rzeczy na twoim terminalu, gdziestrings test.torrent
zachowa się jak.źródło
Aby sprawdzić poprawność pola tekstowego Zaakceptuj tylko Ascii, użyj tego wzorca
[\x00-\x7F]+
źródło
Używam
[^\t\r\n\x20-\x7E]+
i wydaje się, że działa dobrze.źródło
Możesz użyć tego wyrażenia regularnego:
Case ask, opcje to Multiline .
źródło
Naprawdę nie potrzebujesz wyrażenia regularnego.
Spowoduje to również wyświetlenie nazw plików ze znakami sterującymi w nazwach, ale uważam to za funkcję.
Jeśli nie masz żadnych pasujących plików, glob rozwinie się do samego siebie, chyba że
nullglob
ustawiłeś. (Wyrażenie nie pasuje do siebie, więc z technicznego punktu widzenia dane wyjściowe są jednoznaczne).źródło
Okazało się, że jest to bardzo elastyczne i rozszerzalne. $ field = ~ s / [^ \ x00- \ x7F] // g; # w ten sposób można wyczyścić wszystkie elementy spoza ASCII lub określone elementy. Bardzo przyjemny w wyborze lub wstępnym przetwarzaniu elementów, które ostatecznie staną się kluczami mieszania.
źródło