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/'

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


1

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

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

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

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

0

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

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

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


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

@ Стивен Д: Лес - мой друг ... (наполовину медвежонок ... другая половина: я думаю, я бы потерял без них :) ... но я обдумываю это, теперь, когда ты упомянул -r ... (Я думал об этом .. Я буду придерживаться обратной косой черты, в противном случае я потеряю способность понимать все остальные заявления sed :)
Peter.O
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.