Wörter entfernen, die keine Buchstaben enthalten


4

Bei einer Textdatei mit durch Leerzeichen getrenntem String und einer durch Tabulatoren getrennten Ganzzahl möchte ich alle Wörter entfernen, die nicht aus Alpha bestehen, aber Wörter, die nur aus Alpha-Zeichen bestehen, und die Tabulatortaste sowie die Ganzzahl danach beibehalten.

Meine Versuche, wie die unten, haben nichts gebracht. Was ich ausdrücken wollte, ist so etwas wie: "Ersetzen Sie alles innerhalb von Wortgrenzen, das mit 0 oder mehr beginnt und endet, und es gibt mindestens eine: Ziffern: oder: Punkt: Zwischen"

sed 's/\b.*[:digits::punct:]+.*\b//g'
sed 's/\b.*[^:alpha:]+.*\b//g'

Was vermisse ich? Siehe Beispieleingabedaten unten.

Vielen Dank!

Eingang:

asdf 754m   563  
a2a 754mm   291  
754n    463  
754 ppp 1409  
754pin  4652  
pin pin 462  
754pins 652  
754 ppp </D>    1409  
<D> 754pin  4652  
pi$n pin    462  
754/p ins   652  
754 pp+p    1409  
754 p=in    4652  

Gewünschte Leistung:

asdf    563  
    291  
    463  
ppp 1409  
    4652  
pin pin 462  
    652  
 ppp    1409  
    4652  
 pin    462  
 ins    652  
    1409  
    4652  

Antworten:


0

Im Grunde ist dies eine lange Liste von zu löschenden Dingen:

sed -r 's/(^[[:digit:]]+\b|\b[[:digit:]]+[[:punct:]]*[[:alpha:]]+\b|\b[[:alpha:]]+[[:digit:]]+[[:alpha:]]+\b|\b[[:alpha:]]+[[:punct:]]+[[:alpha:]]+\b|[[:punct:]]+.*[[:punct:]]+)//g' file

Löschen Sie diese:

  • Ziffern am Anfang der Zeile
  • Wörter, die mit Ziffern beginnen, können Interpunktion enthalten und in Buchstaben enden
  • Wörter, die aus Buchstaben bestehen, gefolgt von Ziffern, gefolgt von Buchstaben
  • Wörter, die aus Alpha, Punkt, Alpha bestehen
  • Sequenzen, die mit Punktzeichen beginnen und enden

0

Wäre dies nicht am besten mit regulären Ausdrücken gelöst?

([A-Z] + Tab [0-9] + ) oder sowas ähnliches


Nicht genau, weil es mehrere durch Leerzeichen getrennte Zeichenfolgen geben kann, von denen ich einige behalten möchte, während andere weggehen müssen.
dnkb

0

Wenn ich es richtig verstanden habe, möchte man also Wörter behalten, die entweder alle Wörter oder alle Ziffern haben. Aber sonst nichts, wenn so etwas funktionieren sollte:

(^|\s+)([A-Za-z]+|\d+)((?=\s)|(?=$))

(Verwendung mit der mehrzeiligen Flagge)

Wenn Sie Ihre Beispieleingabe ausführen, wird jede Eingabe gefunden, die entweder alle Ziffern oder alle Wörter enthält. Dies ist eine einfachere Lösung im Vergleich zum Auffinden jedes nicht übereinstimmenden Wortes. Sie können jedoch die Daten extrahieren, anstatt die ungültigen Daten zu ersetzen.


Danke, aber es ist nicht genau das, wonach ich gesucht habe. Ich möchte nur die Nummer hinter dem Tab am Ende der Zeilen behalten.
dnkb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.