2016-05-25 24 views
1

Ich bin ein Anfänger in der Programmierung und hatte eine kurze Frage zu Regex Matching und wollte wissen, ob eine schnelle Lösung in bash oder perl zu folgendem Problem bestand:Einfügen ein Kommas zwischen Buchstaben- und Zahlen

Meine Datei sieht etwas wie das.

Boy0.545, 35, 63, 75 
Girl, 63, 723, 845, 45 
Human13, 453, 634, 43 

Wie würde ich ein Komma einfügen, wenn ein Buchstabe DIREKT nach einer Zahl in jeder Zeile gefolgt wird? Ich las gerade etwas Regex und hatte das Gefühl, dass so etwas funktionieren könnte:/^ [: alpha:] [: digit:] $/aber ich bin nicht sicher, wie ich weitermachen soll. Ich hätte gerne

Boy, 0.545, 35, 63, 75 
Girl, 63, 723, 845, 45 
Human, 13, 453, 634, 43 

Jede Hilfe wird geschätzt. Entschuldigung für die einfache Frage! Vielen Dank!

Antwort

6

Versuchen Sie folgendes:

$ cat testfile 
Boy0.545, 35, 63, 75 
Girl, 63, 723, 845, 45 
Human13, 453, 634, 43 

$ sed 's/\([A-Za-z]\)\([0-9]\)/\1, \2/g' testfile 
Boy, 0.545, 35, 63, 75 
Girl, 63, 723, 845, 45 
Human, 13, 453, 634, 43 

\([A-Za-z]\) und \([0-9]\) sind einfangenden Gruppen, die in dem Ersatzabschnitt bezeichnet werden durch \1 und \2 sind. Wir suchen also unmittelbar nach einem Buchstaben nach einer Zahl und ersetzen sie durch den Buchstaben, dann ein Komma, dann ein Leerzeichen und dann die Zahl.

Sie können auch POSIX Zeichenklassen verwenden, wie Sie in Ihrem Beitrag erwähnt:

sed 's/\([[:alpha:]]\)\([[:digit:]]\)/\1, \2/g' testfile 
+0

Vielen Dank. Sehr informative Antwort - vielen Dank für Ihre Hilfe! Definitiv viel gelernt. – JDY

+0

Kein Problem, ich kann Ihnen helfen! :) – Will

3

Sie müssen Erfassungsgruppen verwenden, um den Buchstaben und die Nummer in den Ersatz zu kopieren.

perl -pe 's/([a-z])(\d)/$1, $2/i' 

$1$2 und sind mit den Teilen der Original-Zeichenkette ersetzt, die die Muster in Klammern abgestimmt.

+0

Dieser schlägt mit BSD 'sed'. Es mag nicht "/ i". – Will

+1

@ John1024 Will '' bash'' in Fairness zu Will impliziert normalerweise Werkzeuge wie 'sed',' awk', 'tr', etc. – Barmar

+0

Ich machte es klar, dass dies für Perl und Upvoted war. – Will

Verwandte Themen