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

The output I am expecting is /usr/local/Axis2C AXIS2C_HOME=.

I can't figure out what I am doing wrong. :(

0

3 Answers 3

8

The trivial answer is "more backslashes, fewer spaces":

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

But the broader answer is, "wait, what are you trying to do?" Do you want the key-value pairs to be split into useful variables, or are you really just trying to munge the input into the reverse syntax in order to feed it to something else?

0
1

You have an erroneous space after the =. Try:

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

The following also works and is a bit shorter. \1 will be anything before the first /

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

Sed is great, but Perl can do this too, and it doesn't require the forest of backslashes:

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

Plus, you've got the full power of the regular expression engine, so you can do even more complex patterns.

2
  • 2
    You could also avoid the forest of backslashes if you have a sed such as GNU sed that supports extended regular expressions: echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
    – Steven D
    Commented Feb 7, 2011 at 18:32
  • @Steven D: The forest is my friend... (bear pun half intended... the other half is: I think I'd be lost without them :) ... but I am considering it, now that you've mentioned -r ... (I've thought about it.. I'll stick with the backslashes, otherwise I'll lose the ability to understand everyone else's sed statements :)
    – Peter.O
    Commented Feb 21, 2011 at 10:39

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .