Unter Linux habe ich ein Verzeichnis mit vielen Dateien. Einige von ihnen haben Nicht-ASCII-Zeichen, aber alle sind gültige UTF-8 -Zeichen . Ein Programm hat einen Fehler, der verhindert, dass es mit Nicht-ASCII-Dateinamen funktioniert, und ich muss herausfinden, wie viele davon betroffen sind. Ich wollte dies mit tun find
und dann ein Grep machen , um die Nicht-ASCII-Zeichen zu drucken, und dann ein wc -l
, um die Nummer zu finden. Es muss nicht grep sein; Ich kann jeden regulären Unix-Standardausdruck wie Perl , sed , AWK usw. verwenden.
Gibt es jedoch einen regulären Ausdruck für "ein Zeichen, das kein ASCII-Zeichen ist"?
/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
Antworten:
Dies entspricht einem einzelnen Nicht-ASCII-Zeichen:
Dies ist eine gültige PCRE ( Perl-kompatibler regulärer Ausdruck ).
Sie können auch die POSIX- Abkürzungen verwenden:
[[:ascii:]]
- Entspricht einem einzelnen ASCII-Zeichen[^[:ascii:]]
- Entspricht einem einzelnen Nicht-ASCII-Zeichen[^[:print:]]
wird wahrscheinlich für Sie ausreichen. **quelle
^
ist in PCRE gültig.:print:
funktioniert das nicht in einem UTF8-Terminal? Dies funktioniert für mich in Pry in einem UTF8-Terminal:27.chr =~ /[^[:print:]]/
rename 's/[^\x00-\x7F]//g' *
(Sie können-n
damit überprüfen, ob die Umbenennungen in Ordnung sind).Nein,
[^\x20-\x7E]
ist nicht ASCII.Das ist echtes ASCII:
Andernfalls werden Zeilenumbrüche und andere Sonderzeichen, die Teil der ASCII-Tabelle sind, abgeschnitten!
quelle
Sie können auch diese Seite überprüfen: Unicode-reguläre Ausdrücke , da sie einige nützliche Unicode-Zeichenklassen enthält, wie z.
quelle
[^\x00-\x7F]
und[^[:ascii:]]
einige Kontrollbytes verpassen, so dass Strings manchmal die bessere Option sein können. Zum Beispielcat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'
werden seltsame Dinge an Ihrem Terminal getan, wostrings test.torrent
sich dies verhält.quelle
So überprüfen Sie das Textfeld Akzeptieren Sie Ascii Verwenden Sie nur dieses Muster
[\x00-\x7F]+
quelle
Ich benutze
[^\t\r\n\x20-\x7E]+
und das scheint gut zu funktionieren.quelle
Sie können diesen regulären Ausdruck verwenden:
Bei Fragen fragen, die Optionen sind mehrzeilig .
quelle
Du brauchst nicht wirklich einen regulären Ausdruck.
Dies zeigt auch Dateinamen mit Steuerzeichen in ihren Namen an, aber ich halte das für eine Funktion.
Wenn Sie keine passenden Dateien haben, wird der Glob auf sich selbst erweitert, sofern Sie nichts festgelegt haben
nullglob
. (Der Ausdruck stimmt nicht mit sich selbst überein, daher ist diese Ausgabe technisch eindeutig.)quelle
Dies erwies sich als sehr flexibel und erweiterbar. $ field = ~ s / [^ \ x00- \ x7F] // g; # Somit können alle fraglichen Nicht-ASCII- oder spezifischen Elemente gereinigt werden. Sehr schön bei der Auswahl oder Vorverarbeitung von Elementen, die schließlich zu Hash-Schlüsseln werden.
quelle