Sed untuk membalikkan dua kata

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

Output yang saya harapkan adalah /usr/local/Axis2C AXIS2C_HOME=.

Saya tidak tahu apa yang saya lakukan salah. :(

Ricko M
sumber

Jawaban:

8

Jawaban sepele adalah "lebih banyak garis miring terbalik, lebih sedikit ruang":

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

Tetapi jawaban yang lebih luas adalah, "tunggu, apa yang Anda coba lakukan?" Apakah Anda ingin pasangan kunci-nilai dipecah menjadi variabel yang berguna, atau Anda benar-benar hanya mencoba untuk memasukkan input ke dalam sintaks terbalik untuk mengumpankannya ke sesuatu yang lain?

mattdm
sumber
1

Anda memiliki ruang yang keliru setelah =. Mencoba:

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

Berikut ini juga berfungsi dan sedikit lebih pendek. \1akan menjadi apa pun sebelum yang pertama/

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

Sed memang bagus, tapi Perl juga bisa melakukan ini, dan itu tidak membutuhkan hutan backslash:

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

Plus, Anda memiliki kekuatan penuh dari mesin ekspresi reguler, sehingga Anda dapat melakukan pola yang lebih kompleks.

jsbillings
sumber
2
Anda juga dapat menghindari hutan backslash jika Anda memiliki sedGNU sed yang mendukung ekspresi reguler yang diperluas:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D
@ Sebelas D: Hutan adalah temanku ... (beruang pun setengah dimaksudkan ... setengah lainnya adalah: Saya pikir saya akan hilang tanpa mereka :) ... tapi saya sedang mempertimbangkannya, sekarang Anda sudah disebutkan -r ... (Saya sudah memikirkannya .. Saya akan tetap dengan backslash, kalau tidak saya akan kehilangan kemampuan untuk memahami pernyataan sed orang lain :)
Peter.O