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. :(

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?


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|'

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.