web-dev-qa-db-fra.com

Supprimer tout le texte anglais et laisser le texte arabe

Cette question ressemble beaucoup à this . J'ai juste besoin d'une légère modification.

J'ai un fichier csv qui ressemble à ceci

y(document).ready(function($) {     $('#wp_mep_2').mediaelementplayer({         m:1                 ,features: ['playpause','current','progress','duration','volume','tracks','fullscreen']         ,audioWidth:250,audioHeight:30  }); });","I'm not"
"100","أستطيع                                                                                                                           00:0000:0000:00  jQuery(document).ready(function($) {   $('#wp_mep_1').mediaelementplayer({         m:1                 ,features: ['playpause','current','progress','duration','volume','tracks','fullscreen']         ,audioWidth:250,audioHeight:30  }); });","I"
"101","كما","As"
"102","شئ","Anything"
"103","منذ","Since"
"104","لذا","So"
"105","واحد","One"
"106","جدا","Very"
"107","يمكنك","You can"
"108","لديك","You have"
"109","الرجل","Man"
"110","يبدو","Seems"
"111","كلا","Both"
"112","لدي","I have"
"113","أوه","Oh"
"114","تفعل","Do"
"115","سيدي","Sir"

Je veux supprimer tout sauf le texte arabe, des mots séparés par des virgules avec lesquels je peux travailler. Est-ce que grep ou Perl pourraient le faire? Si grep peut le faire, je serai étonné. Je ne sais pas comment détecter aucun caractère anglais, sinon j'aurais utilisé la question précédente comme référence.

5
Lynob

Vous pouvez utiliser tr:

tr -s '[\0-\200]' ' ' < file

remplace tous les caractères du code ASCII = (0)dix en code ASCII = (128)dix avec un seul espace.

\nnn est un caractère de valeur octale nnn. (128)décimal= (200)octal

[\0-\200] comme la classe alpha [A-Z] c'est une classe de caractères qui inclut tout caractères de contrôle ASCII .

ou utiliser :

tr -s '[ -~]' ' ' < file

Cette commande est identique à la commande tr -s '[\40-\176]' ' ' < file qui remplace tous les caractères ASCII situés entre l'espace et le caractère ~. Voir le caractères de contrôle ASCII .

Sortie:

 أستطيع كما شئ منذ لذا واحد جدا يمكنك لديك الرجل يبدو كلا لدي أوه تفعل سيدي 

Une autre façon utilise cette classe et la commande awk:

awk '{gsub(/[\0-\200]/, "");print}'  file
أستطيع
كما
شئ
منذ
لذا
واحد
جدا
يمكنك
لديك
الرجل
يبدو
كلا
لدي
أوه
تفعل
سيدي

Vous pouvez utiliser les mêmes méthodes avec la commande grep:

grep -Po '[^ -~]+' file
grep -Po '[^\0-\200]+' file
grep -Po '[^\x0-\x80]+' file  #used HEX code
7
αғsнιη

Puisque vous avez spécifiquement interrogé Perl, il semble possible de le faire à l'aide du spécificateur de propriété unicode \p{ARABIC} de Perl, bien qu'il semble nécessaire de décoder le codage UTF-8 avant d'appliquer le test regex.

Dans sa forme la plus simple, vous pouvez simplement supprimer des caractères non arabes et ré-encoder:

$ Perl -MEncode -lpe '$_ = decode("UTF-8",$_); s/\P{ARABIC}+//g; $_ = encode("UTF-8", $_)' yourfile.csv 

أستطيع
كما
شئ
منذ
لذا
واحد
جدا
يمكنك
لديك
الرجل
يبدو
كلا
لدي
أوه
تفعل
سيدي

Si vous souhaitez traiter le fichier CSV de manière un peu plus structurée, vous pouvez procéder comme suit:

#!/usr/bin/Perl -wl

use strict;
use Encode;

my @F;
my @matches;
my $infile = $ARGV[0];

open FILE, $infile or die $!;

while (<FILE>) {
  @F = split(',');
  Push @matches, grep { decode("UTF-8",$_) =~ /\"\p{ARABIC}+\"/ } @F;
}

print join ", ", map {$_ =~ s/\"//g; $_} @matches;

Tester à nouveau avec les données fournies en tant que yourfile.csv:

$ ./print_arabic.pl yourfile.csv
كما, شئ, منذ, لذا, واحد, جدا, يمكنك, لديك, الرجل, يبدو, كلا, لدي, أوه, تفعل, سيدي

[Pour une raison quelconque, les commutateurs espace et virgule sont placés lorsque le texte arabe est collé dans le navigateur à partir de mon terminal - peut-être à cause de la propriété de script de droite à gauche?]

4
steeldriver