Sed pour inverser deux mots


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

La sortie que j'attends est /usr/local/Axis2C AXIS2C_HOME=.

Je ne peux pas comprendre ce que je fais mal. :(

Réponses:


8

La réponse triviale est "plus de barres obliques inverses, moins d'espaces":

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

Mais la réponse plus large est "attendez, qu'essayez-vous de faire?" Voulez-vous que les paires clé-valeur soient divisées en variables utiles, ou essayez-vous vraiment de fusionner l'entrée dans la syntaxe inverse afin de la nourrir à autre chose?


1

Vous avez un espace erroné après le =. Essayer:

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

Ce qui suit fonctionne également et est un peu plus court. \1sera quelque chose avant le premier/

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

0

Sed est génial, mais Perl peut le faire aussi, et il ne nécessite pas la forêt de contre-obliques:

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

De plus, vous disposez de toute la puissance du moteur d'expression régulière, vous pouvez donc créer des motifs encore plus complexes.


2
Vous pouvez également éviter la forêt de barres obliques inverses si vous avez un sedtel que GNU sed qui prend en charge les expressions régulières étendues:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D

@Steven D: La forêt est mon ami ... (ours jeu de mots à moitié prévu ... l'autre moitié est: je pense que je serais perdu sans eux :) ... mais j'y pense, maintenant que vous avez mentionné -r ... (J'y ai pensé .. Je vais m'en tenir aux contre-obliques, sinon je perdrai la capacité de comprendre les déclarations sed de tout le monde :)
Peter.O
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.