2016-12-23 2 views
-1

Ich bin neu in Sed, ich versuche, einige Muster mit Sed lernen. Ich habe eine filenamne.txt, die den folgenden Eintrag hat:Swaps Spalten in bash mit SED ohne Schleife

ppp/jjj qqq/kkk rrr/lll

Mein Ziel ist es, das Wort vor dem Schrägstrich und das Wort nach dem Schrägstrich zu tauschen in jedem der drei word1/word2 Spalten:

jjj/ppp kkk/qqq lll/rrr

Ich versuchte mit sed –re ‘s!(.*)(/)(.*)!\1\2\!’ filename.txt, aber es hat nicht funktioniert. Irgendeine Idee, wie kann ich darüber gehen?

+1

'\ 1 \ 2' die Spalten in derselben Reihenfolge hält. Es sollte "\ 2 \ 1" sein, um sie zu tauschen. – Barmar

Antwort

1
$ echo "ppp/jjj qqq/kkk rrr/lll" | sed -e 's/$/ /' -e 's!\([^/]*\)/\([^ ]*\) !\2/\1 !g' 
jjj/ppp kkk/qqq lll/rrr 
+1

Sie fügen einen Speicherplatz hinzu, der zum Bereinigen entfernt werden kann. Sie könnten vielleicht vermeiden, den Platz hinzufügen zu müssen, wenn Sie eine positive Zeichenklasse wie '[a-zA-Z]' verwendet haben - das würde sauber zu dem Beispiel passen, aber es hängt davon ab, wie die echten im Gegensatz zu Beispieldaten aussehen. –

1

Verwenden Ersatz in perl Befehlszeile ist viel mehr straight-forward: -

perl -pe 's/(\w+)\/(\w+)/$2\/$1/g' file 
jjj/ppp kkk/qqq lll/rrr 
+1

das ist nicht direkter als das Äquivalent GNU sed: 'sed -E # (\ w +)/(\ w +) # \ 2/\ 1 # g 'Datei' –

0
$ sed 's#\([^ ]*\)/\([^ ]*\)#\2/\1#g' file 
jjj/ppp kkk/qqq lll/rrr