2017-12-07 7 views
-4

Ich brauche Hilfe beim Erstellen eines sed-Befehls, der die Felder in der Datei nach unten so anordnet, dass sie durch einen Doppelpunkt getrennt sind und ihre Reihenfolge neu angeordnet ist, state:lastName:restOfName:city (die Adresse wird gelöscht) .Umsortieren und Löschen von Feldern mit sed

Mickey Mouse, 1111 Disney Dr., Orlando FL 
Minnie Mouse, 1112 Disney Dr., Anaheim CA 
Adam Voter, 902 Biscayne Blvd., Miami FL 

Sie sollen wie folgt aussehen, wenn sie fertig sind.

FL:Mouse:Mickey:Orlando 
CA:Mouse:Minnie:Anaheim 
FL:Voter:Adam:Miami 

Das ist Hausaufgaben und ich kann nur sed verwenden.

+1

Was haben Sie versucht und was nicht funktioniert? – karakfa

+1

Dies ist kein kostenloser Code-schreiben-Service, Sie müssen zumindest etwas selbst versucht haben ... http: //idownvotedbecau.se/noattempt/ – Nic3500

+0

Entschuldigung für die sofortige Reaktion.Ich versuche, alle Räume und anderes Material zu entfernen, indem ich etwas wie dieses benutze. Sed-s 's /, /:/g' -e 's//:/g' -e 's /\.// g' Ding. – Matt

Antwort

0

Sie können folgende sed-Befehl verwenden, lassen Sie mich wissen, wenn Sie es zusätzliche Erklärungen benötigen:

sed -E -i.bak 's/^([^\s]*)\s+([^,]*),[^,]*,\s*([^\s]*)\s+([^\s]*)\s*$/\4:\2:\1:\3/g' test_add_file.in; 

Getestet auf:

enter image description here

Auf den Punkt gebracht, Sie sind Definieren Sie einen Regex, den sed verwenden wird, um in Ihrer Textdatei nach den erforderlichen Mustern zu suchen, und verwenden Sie dann backreferences, um das tatsächlich vorhandene Muster wiederzuverwenden während des Prozesses identifiziert.

Die genaue Syntax über die regex Blick auf diesen Link:

http://www.rexegg.com/regex-quickstart.html

Kurz:

  • ^ Anfang der Zeile den Start Ihrer Muster zu beheben
  • ([^\s]*) wird verwendet, um Ihre Mickey, Minnie,... (Wiederholung von 0 bis N nicht leeres Zeichen, das zwischen Klammern sein wird, da dies als bac wiederverwendet wird k ref
  • \s+ 1 oder mehr Räume zwischen Mickey and Mouse
  • ([^,]*) wird dem Mouse Teil der Zeichenfolge (Wiederholung von 0 bis N non comma char) entsprechen
  • ,[^,]*,\s* Teil zwischen den 2 Kommas, die nicht verwendet wird , 1112 Disney Dr.,
  • ([^\s]*) verwendet Orlando, Anaheim
  • \s+ 1 oder mehr Räume zwischen Orlando and FL
  • zu holenverwendet FL, CA, ...
  • \s*$ das Musterende mit $ bei EOL mit schließlich Leerzeichen zu holen beheben

dann im Ersatzteil Ihrer sed Befehl neu ordnen Sie die Muster und Sie Spalte zwischen ihnen setzen durch \4:\2:\1:\3

+1

Vielen Dank für Ihre Hilfe. – Matt