Sed para revertir dos palabras

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

La salida que espero es /usr/local/Axis2C AXIS2C_HOME=.

No puedo entender lo que estoy haciendo mal. :(

Ricko M
fuente

Respuestas:

8

La respuesta trivial es "más barras invertidas, menos espacios":

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

Pero la respuesta más amplia es: "espera, ¿qué estás tratando de hacer?" ¿Desea que los pares clave-valor se dividan en variables útiles, o realmente solo está tratando de combinar la entrada en la sintaxis inversa para alimentarla a otra cosa?

mattdm
fuente
1

Tienes un espacio erróneo después del =. Tratar:

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

Lo siguiente también funciona y es un poco más corto. \1será cualquier cosa antes de la primera/

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

Sed es genial, pero Perl también puede hacer esto, y no requiere el bosque de barras invertidas:

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

Además, tiene todo el poder del motor de expresión regular, por lo que puede hacer patrones aún más complejos.

jsbillings
fuente
2
También podría evitar el bosque de barras diagonales inversas si tiene un sedGNU sed que admite expresiones regulares extendidas:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D
@ Steven D: El bosque es mi amigo ... (la mitad del juego de palabras del oso ... la otra mitad es: creo que estaría perdido sin ellos :) ... pero lo estoy considerando, ahora que has mencioné -r ... (Lo he pensado ... Me quedaré con las barras diagonales inversas, de lo contrario perderé la capacidad de comprender las declaraciones sed de todos los demás :)
Peter.O