2016-06-27 7 views
1

Ich brauche eine Wörterbuchdatenbank, aber das meiste davon ist ein alphanumerisches, nutzloses Zeug, und die interessanten Felder sind entweder nicht alphanumerisch (wie chinesische Schriftzeichen) oder in einigen Klammern. Ich habe viel gesucht, viel über Tools wie sed, awk, grep usw. gelernt, sogar über ein Python-Skript nachgedacht, aber es ist mir nie gelungen, eine Lösung zu finden.So löschen Sie alphanumerische Wörter aus einer Unicode-Datei

Eine Zeile der Datenbank wie folgt aussieht:

助 L1782 DN1921 K407 O431 DO346 MN2313 MP2.0376 E314 IN623 DA633 DS248 DF367 DH330 DT284 DC248 DJ826 DG211 DM1800 P1-5-2 I2g5.1 Q7412.7 DR3945 Yzhu4 Wjo ジョ たす.ける たす.かる す.ける すけ {help} {rescue} {assist} 

Ich brauche es so zu sein:

助 ジョ たす.ける たす.かる す.ける すけ {help} {rescue} {assist} 

Ho kann mich mit dieser eine der oben genannten Tool?

Antwort

1

Hier ist eine Python-Lösung, wenn Sie noch ein möchten:

import re 
alpha_brack = re.compile(r"([a-zA-Z0-9.\-]+)|({.*?})") 

my_string = """ 
助 L1782 DN1921 K407 O431 DO346 MN2313 MP2.0376 E314 IN623 DA633 DS248 DF367 
DH330 DT284 DC248 DJ826 DG211 DM1800 P1-5-2 I2g5.1 Q7412.7 DR3945 Yzhu4 
Wjo ジョ たす.ける たす.かる す.ける すけ {help} {rescue} {assist}""" 

match = alpha_brack.findall(my_string) 

new_string = my_string 

for g0, _ in match: # only care about first group! 
    new_string = new_string.replace(g0,'',1) # replace only first occurence! 

final = re.sub(r'\s{2,}',' ', new_string) # finally, clean up whitespace 

print(final) 

Meine Ergebnisse:

‚助 ジ ョ た す け る た す か る す け る す け { Hilfe} {Rettung} {Hilfe} '

+0

Dies ist eine Menge zusätzlicher Arbeit: Sie können das Spiel in Scheiben schneiden: 're.findall() [1]', um das erste Ergebnis. 're.search()' gibt auch nur die erste Übereinstimmung zurück (aber als ein Übereinstimmungsobjekt) – TemporalWolf

+0

@TemporalWolf Es wird spät, also bin ich vielleicht nur müde, aber ich verstehe nicht, warum du es abschneiden willst .findall() '? Das würde mir eine Liste mit einem einzelnen Tupel geben, brauche ich nicht alle Tupel für das Match? –

+0

Nein, ich irre mich nur: Ich habe falsch gelesen, was du getan hast. Guter Ruf. – TemporalWolf

0

Persönlich Ihr Beispiel Linie gegeben, hatte ich alle alphanumerischen Zeichen sed aus, die mit einem Raum beginnen und enden:

sed -i 's/ [a-zA-Z0-9 .-]+//g' sollte dicht sein, was Sie brauchen. Möglicherweise müssen Sie weitere Sonderzeichen hinzufügen, wenn der zu löschende Text andere Elemente enthält. Dies ist eine In-Place-Substitution für ein einzelnes Leerzeichen (im Wesentlichen Löschen).

Keine Linux-Box zur Überprüfung dieses ... es kann ein wenig massieren erfordern.

Ebenfalls erwähnenswert, dies wird nicht Arbeit, wenn die Klammern können zwei Leerzeichen enthalten: {test results found}, wie es die results

0

Mit perl werden wegblasen:

perl -ne ' 
    m/(.*?)({.*)/; # Split based on '{' 
    my $a=$1; my $b=$2; 
    $a =~ s/[[:alnum:]-.]//g; #Remove alphabets, numbers, '.', '-' (add more characters as you need.) 
    $a =~ s/ +/ /g; # Compress spaces. 
    print "$a $b\n"; #Print 2 parts and a newline 
' dbfile.txt 

Erklärung in den Inline-Kommentare .

ähnliche Logik mit sed:

sed ' 
    h; #Save line in hold space. 
    s/{.*//; # Remove 2nd part 
    s/[a-zA-Z0-9.-]//g; # Remove all alphabets, numbers, . & - 
    s/ */ /g; # Compress spaces 
    x; #Save updated 1st part in hold space, take back the complete line in pattern space 
    s/[^{]*{/{/; #Remove first part 
    x; #Swap hold & pattern space again. 
    G; # Append 2nd part to first part separated by newline 
    s/\n//; # Remove newline. 
    ' dbfile.txt 
0

Verwenden von Shell-Skript (Bash):

#!/bin/bash 

string="助 L1782 DN1921 K407 O431 DO346 MN2313 MP2.0376 E314 IN623 DA633 DS248 DF367 DH330 DT284 DC248 DJ826 DG211 DM1800 P1-5-2 I2g5.1 Q7412.7 DR3945 Yzhu4 Wjo ジョ たす.ける たす.かる す.ける すけ {help} {rescue} {assist}" 

echo "" > tmpfield 

for field in $string 
do 
    if [ "${field:0:1}" != "{" ];then    # 
     echo $field|sed "s/[a-zA-Z0-9 .-]/ /g" >> tmpfield 
    else 
     echo $field >> tmpfield 
    fi 
done 

#convert rows to one column 

cat tmpfield | awk 'NF'|awk 'BEGIN { ORS = " " } { print }' 

Meine Ausgabe:

[email protected]:/mnt$ bash 1.bash 
    助 ジョ たす ける たす かる す ける すけ {help} {rescue} {assist}