Remova todo o texto em inglês e deixe o texto em árabe

5

Esta questão é muito parecida com esta . Eu só preciso de uma ligeira modificação.

Eu tenho um arquivo csv parecido com este

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"

Eu quero remover tudo, exceto o texto em árabe, palavras separadas por vírgula com as quais posso trabalhar. Poderia grep ou Perl fazer isso? Se o grep conseguir, ficarei impressionado. Eu não sei como detectar nenhum caractere inglês, caso contrário eu usaria a pergunta anterior como referência.

    
por Lynob 29.12.2014 / 20:17

2 respostas

7

Você pode usar tr :

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

substitua todos os caracteres do código ASCII = (0) 10 pelo código ASCII = (128) 10 com espaço único.

\nnn é caractere com valor octal nnn . (128) decimal = (200) octal

[[A-Z]-0] como classe alfa tr -s '[-6]' ' ' < file é uma classe de caracteres que inclui todos os caracteres de controle ASCII .

ou use:

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

Este comando é igual ao comando ~ , que substitui todos os caracteres ASCII entre espaço e caractere awk . Veja os caracteres de controle ASCII .

Saída:

awk '{gsub(/[
grep -Po '[^ -~]+' file
grep -Po '[^
tr -s '[
tr -s '[ -~]' ' ' < file
-0]' ' ' < file
-0]+' file grep -Po '[^\x0-\x80]+' file #used HEX code
-0]/, "");print}' file أستطيع كما شئ منذ لذا واحد جدا يمكنك لديك الرجل يبدو كلا لدي أوه تفعل سيدي

Outra maneira é usar essa classe e o comando grep :

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

Você pode usar os mesmos métodos com o comando %code% :

awk '{gsub(/[
grep -Po '[^ -~]+' file
grep -Po '[^%pre%-0]+' file
grep -Po '[^\x0-\x80]+' file  #used HEX code
-0]/, "");print}' file أستطيع كما شئ منذ لذا واحد جدا يمكنك لديك الرجل يبدو كلا لدي أوه تفعل سيدي
    
por devWeek 29.12.2014 / 21:05
4

Como você perguntou especificamente sobre o perl, parece ser possível fazê-lo usando o especificador de propriedade \p{ARABIC} unicode do perl, embora pareça ser necessário decodificar a codificação UTF-8 antes de aplicar o teste regex.

Na sua forma mais simples, você pode simplesmente excluir caracteres não arábicos e recodificar:

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

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

Se você quiser processar o CSV de uma forma mais estruturada, pode fazer algo assim:

#!/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;

Teste novamente com dados fornecidos como yourfile.csv :

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

[Por algum motivo, a vírgula e o espaço trocam de lugar quando o texto em árabe é colado no navegador do meu terminal - talvez por causa da propriedade de script da direita para a esquerda?]

    
por steeldriver 30.12.2014 / 04:01