echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\) \(.*\)/ \2 \1/'
Результат, который я ожидаю, таков /usr/local/Axis2C AXIS2C_HOME=
.
Я не могу понять, что я делаю неправильно. :(
Тривиальный ответ: «больше обратной косой черты, меньше пробелов»:
echo "AXIS2C_HOME=/usr/local/Axis2C" | sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'
Но более широкий ответ: «подожди, что ты пытаешься сделать?» Вы хотите, чтобы пары ключ-значение были разбиты на полезные переменные, или вы действительно просто пытаетесь преобразовать ввод в обратный синтаксис, чтобы передать его чему-то еще?
У вас есть ошибочное место после =
. Пытаться:
sed 's/\(^AXIS2C_HOME=\)\(.*\)/\2 \1/'
Следующее также работает и немного короче. \1
будет что-нибудь до первого/
sed 's|^\([^/]*\)\(/.*\)|\2 \1|'
Sed великолепен, но Perl тоже может это сделать, и ему не нужен лес обратной косой черты:
% echo "AXIS2C_HOME=/usr/local/Axis2C" | perl -pe 's/(^AXIS2C_HOME=)(.*)/\2 \1/'
/usr/local/Axis2C AXIS2C_HOME=
Кроме того, у вас есть все возможности механизма регулярных выражений, поэтому вы можете создавать еще более сложные шаблоны.
sed
такой как GNU sed, который поддерживает расширенные регулярные выражения:echo "AXIS2C_HOME=/usr/local/Axis2C" | sed -r 's/(^AXIS2C_HOME=)(.*)/\2 \1/'