Entfernen Sie Zeilen, die nicht-englische Zeichen (Ascii) enthalten, aus einer Datei

8

Ich habe eine Textdatei mit Zeichen aus verschiedenen Sprachen wie (chinesisch, lateinisch usw.)

Ich möchte alle Zeilen entfernen, die diese nicht-englischen Zeichen enthalten. Ich möchte alle englischen Zeichen (a-b), Zahlen (0-9) und alle Interpunktionen einschließen.

Wie kann ich es mit Unix-Tools wie awk oder sed machen.

    
Sudar 20.07.2012, 10:42
quelle

4 Antworten

15

Perl unterstützt eine [:ascii:] Zeichenklasse.

%Vor%     
Dennis Williamson 20.07.2012, 11:10
quelle
2

Sie können egrep -v verwenden, um nur die Zeilen nicht zurückzugeben, die mit dem Muster übereinstimmen, und etwas wie [^ a-zA-Z0-9.,;:-'"?!] als Muster verwenden (je nach Bedarf mehr Interpunktion).

Hm, wenn man darüber nachdenkt, ist eine doppelte Negation ( -v und die umgekehrte Zeichenklasse) wahrscheinlich nicht so gut. Ein anderer Weg könnte ^[ a-zA-Z0-9.,;:-'"?!]*$ sein.

Sie können auch nur nach ASCII filtern:

%Vor%     
Joey 20.07.2012 10:44
quelle
2

Sie können Awk verwenden, vorausgesetzt Sie erzwingen die Verwendung des Gebietsschemas C:

%Vor%

Die Umgebungsvariable LC_TYPE=C (oder LC_ALL=C ) erzwingt die Verwendung der C-Ländereinstellung für die Zeichenklassifizierung. Es ändert die Bedeutung der Zeichenklassen ( [:alnum:] , [:space:] usw.), um nur ASCII-Zeichen zu entsprechen.

Die /[^[:alnum:][:space:][:punct:]]/ regex-Übereinstimmung mit beliebigen Nicht-ASCII-Zeichen. Die ! vor der Regex invertieren die Bedingung. Daher stimmen nur Zeilen ohne Nicht-ASCII-Zeichen überein. Wenn keine Aktion ausgeführt wird, wird die Standardaktion für übereinstimmende Zeilen verwendet ( print ).

EDIT: Dies kann auch mit grep gemacht werden:

%Vor%     
Ael Ombreglace 20.07.2012 14:14
quelle
1

Mit GNU grep, das Perl-kompatible reguläre Ausdrücke unterstützt, können Sie verwenden:

%Vor%     
hek2mgl 08.09.2017 07:16
quelle

Tags und Links