Sed para reverter duas palavras

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

A saída que eu estou esperando é /usr/local/Axis2C AXIS2C_HOME=.

Não consigo descobrir o que estou fazendo de errado. :(

Ricko M
fonte

Respostas:

8

A resposta trivial é "mais barras invertidas, menos espaços":

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

Mas a resposta mais ampla é: "espere, o que você está tentando fazer?" Deseja que os pares de valores-chave sejam divididos em variáveis ​​úteis ou você está realmente apenas tentando inserir a entrada na sintaxe reversa para alimentá-la com outra coisa?

mattdm
fonte
1

Você tem um espaço incorreto após o =. Tentar:

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

O seguinte também funciona e é um pouco mais curto. \1será qualquer coisa antes do primeiro/

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

O Sed é ótimo, mas o Perl também pode fazer isso e não requer a floresta de barras invertidas:

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

Além disso, você tem todo o poder do mecanismo de expressão regular, para poder fazer padrões ainda mais complexos.

jsbillings
fonte
2
Você também pode evitar a floresta de barras invertidas se tiver um sedGNU sed que suporte expressões regulares estendidas:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D
@ Steven D: A floresta é minha amiga ... (trocadilho com urso pretendido ... a outra metade é: acho que ficaria perdido sem eles :) ... mas estou pensando nisso, agora que você já mencionado -r ... (Eu tenho pensado sobre isso .. eu vou ficar com as barras invertidas, senão eu vou perder a capacidade de compreender todos else é sed :)
Peter.O