Sed, чтобы полностью изменить два слова

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

Результат, который я ожидаю, таков /usr/local/Axis2C AXIS2C_HOME=.

Я не могу понять, что я делаю неправильно. :(

Рико М
источник

Ответы:

8

Тривиальный ответ: «больше обратной косой черты, меньше пробелов»:

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

Но более широкий ответ: «подожди, что ты пытаешься сделать?» Вы хотите, чтобы пары ключ-значение были разбиты на полезные переменные, или вы действительно просто пытаетесь преобразовать ввод в обратный синтаксис, чтобы передать его чему-то еще?

mattdm
источник
1

У вас есть ошибочное место после =. Пытаться:

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

Следующее также работает и немного короче. \1будет что-нибудь до первого/

sed 's|^\([^/]*\)\(/.*\)|\2 \1|'
SiegeX
источник
0

Sed великолепен, но Perl тоже может это сделать, и ему не нужен лес обратной косой черты:

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

Кроме того, у вас есть все возможности механизма регулярных выражений, поэтому вы можете создавать еще более сложные шаблоны.

jsbillings
источник
2
Вы также можете избежать леса обратной косой черты, если у вас есть sedтакой как GNU sed, который поддерживает расширенные регулярные выражения:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
Steven D
@ Стивен Д: Лес - мой друг ... (наполовину медвежонок ... другая половина: я думаю, я бы потерял без них :) ... но я обдумываю это, теперь, когда ты упомянул -r ... (Я думал об этом .. Я буду придерживаться обратной косой черты, в противном случае я потеряю способность понимать все остальные заявления sed :)
Peter.O