Использование Sed с регулярными выражениями для замены подстроки

Я использую Ubuntu Natty.

Я пытаюсь использовать sed для замены строки с помощью командной строки.

Часть текстового файла (app.config), которую я пытаюсь заменить, выглядит следующим образом:

%% http is a list of IP addresses and TCP ports that the Riak
%% HTTP interface will bind.
{http, [ {"127.0.0.1", 8098 } ]},

И я пытаюсь заменить IP-адрес на что-то другое. Вот мой код:

 ip="192.168.10.12"    
 sed -i "s/\(\{http,[\t ]*\[[\t ]*\{\)\"[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\"/\1\"$ip\"/" /root/sandbox/app.config

Однако я получаю сообщение об ошибке sed: -e expression #1, char 103: Invalid preceding regular expression.

Что я делаю не так?

Заранее спасибо.


person BannerMan    schedule 13.12.2011    source источник


Ответы (2)


Добавьте флаг регулярного выражения, отредактируйте регулярное выражение, удалив escape-последовательности из ключевых слов, таких как ( или {. Кажется, работает сейчас

ip="192.168.10.12"
sed -i -r "s/(\{http,[\t ]*\[[\t ]*\{)\"[1-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\"/\1\"$ip\"/" /root/sandbox/app.config
person ДМИТРИЙ МАЛИКОВ    schedule 13.12.2011
comment
Я получаю sed: -e expression #1, char 104: invalid reference \1 on \'s' command's RHS, используя -r, как указано выше. msg указывает на \1, но это кажется уместным. Ошибка в седе? Также давайте сравним версии sed ;-), у меня GNU sed version 4.2.1. Всем удачи. - person shellter; 14.12.2011
comment
@shellter, у меня такой же: GNU sed version 4.2.1 - person ДМИТРИЙ МАЛИКОВ; 14.12.2011
comment
Weifd ;-). Спасибо, что поделился. К следующей проблеме и удачи! - person shellter; 14.12.2011

Это может сработать для вас:

sed  "s/\({http,[\t ]*\[[\t ]*{\)\"[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\"/\1\"$ip\"/"

Вам не нужно экранировать {, когда они буквальные.

person potong    schedule 13.12.2011