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. :(
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?
Sie haben ein fehlerhaftes Leerzeichen nach dem =
. Versuchen:
sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'
Das Folgende funktioniert auch und ist etwas kürzer. \1
wird alles vor dem ersten sein/
sed 's|^\([^/]*\)\(/.*\)|\2 \1|'
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.
sed
solches 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/'