2017-06-12 1 views
0

Ich habe eine Datei von 1000 Zeilen, mit 5 bis 8 Spalten in jeder getrennten Leitung von :Swapping Spalten in vi mit regex ohne awk zu verwenden, lesen, etc

1:2:3:4:5:6:7:8 

4g10:8s:45:9u5b:a:z1 

Ich möchte in einigen alle Zeilen haben Bestellung 4:3:1:2:5:6:7...

Wie würde ich nur die ersten 4 Spalten mit Regex tauschen? Hier

+0

Nicht klar, bitte fügen Sie mehr Beispiel Input_file und erwartete Ausgabe auch in Ihrem Beitrag mit Code-Tags. – RavinderSingh13

Antwort

0

ich denke, das wahrscheinlich einfacher wäre mit einem anderen Ansatz zu tun, aber man konnte ex, es zu tun verwenden, so im Befehlsmodus und geben Sie ein:

:%s/^\([^:]\+\):\([^:]\+\):\([^:]\+\):\([^:]\+\):/\4:\3:\1:\2:/ 

, die Erfassungsgruppen für die ersten vier mit Doppelpunkt getrennten Felder erstellen und dann in einer anderen Reihenfolge ersetzen als ursprünglich dort.

+0

@ondrej guten Fang, ich habe es jetzt hier behoben –

0

ist ein regulärer Ausdruck, die tun sollten, was Sie suchen:

newtext = re.sub("([^:]+):([^:]+):([^:]+):([^:]+)(:)?(.*)?",r"\4:\3:\1:\2\5\6",text) 

Die wegzunehmen ist Sie wollen Parans verwenden für die Erfassung und dann neu ordnen sie in der Reihenfolge, die Sie wollen in der ersetzen . Jeder capture „Gruppe“ ist nur ein oder mehrere nicht: getrennt durch: Wenn es die Möglichkeit von Leer Gruppen jeweils + auf einen * Änderung

Hier ist ein Beispiel in Python aus Gründen der Klarheit ist:

import re 

textlist = [ 
"1:2:3:4:5:6:7:8", 
"1:2:3:4:5", 
"1:2:3:4", 
] 


for text in textlist: 
    newtext = re.sub("([^:]+):([^:]+):([^:]+):([^:]+)(:)?(.*)?",r"\4:\3:\1:\2\5\6",text) 
    print (newtext) 

output:

4:3:1:2:5:6:7:8 
4:3:1:2:5 
4:3:1:2