Sed, um zwei Wörter umzukehren

8
echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\) \(.*\)/ \2 \1/'

Die Ausgabe, die ich erwarte, ist /usr/local/Axis2C AXIS2C_HOME=.

Ich kann nicht herausfinden, was ich falsch mache. :(

Ricko M.
quelle

Antworten:

8

Die triviale Antwort lautet "mehr Backslashes, weniger Leerzeichen":

echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

Aber die breitere Antwort lautet: "Warte, was versuchst du zu tun?" Möchten Sie, dass die Schlüssel-Wert-Paare in nützliche Variablen aufgeteilt werden, oder versuchen Sie wirklich nur, die Eingabe in die umgekehrte Syntax zu mischen, um sie an etwas anderes weiterzuleiten?

mattdm
quelle
1

Sie haben ein fehlerhaftes Leerzeichen nach dem =. Versuchen:

sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'

Das Folgende funktioniert auch und ist etwas kürzer. \1wird alles vor dem ersten sein/

sed 's|^\([^/]*\)\(/.*\)|\2 \1|'
SiegeX
quelle
0

Sed ist großartig, aber Perl kann das auch und es erfordert keinen Wald von Backslashes:

% echo "AXIS2C_HOME=/usr/local/Axis2C" | perl -pe 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
/usr/local/Axis2C AXIS2C_HOME=

Außerdem haben Sie die volle Leistung der Engine für reguläre Ausdrücke, sodass Sie noch komplexere Muster erstellen können.

jsbillings
quelle
2
Sie könnten auch den Wald der Backslashes vermeiden, wenn Sie ein sedsolches wie GNU sed haben, das erweiterte reguläre Ausdrücke unterstützt:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D
@Steven D: Der Wald ist mein Freund ... (Bärenwortspiel halb beabsichtigt ... die andere Hälfte ist: Ich denke, ich wäre ohne sie verloren :) ... aber ich denke darüber nach, jetzt wo du es hast erwähnt -r ... (Ich habe darüber nachgedacht .. Ich werde mich an die Backslashes halten, sonst verliere ich die Fähigkeit, die sed-Aussagen aller anderen zu verstehen :)
Peter.O