Назад | Перейти на главную страницу

Невозможно заменить строку на sed. Получение неизвестного варианта

Я пытаюсь заменить строку на sed (редактор потока), однако я получаю сообщения об ошибках. Вероятно, потому что я неправильно использую строку из-за символов.

Я пытаюсь заменить следующую строку:

<VirtualHost |IP|:|PORT_80| |MULTI_IP|> 

с участием

<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>

В файле под названием virtual_host2.conf

Бух, когда я пробую несколько вещей, я всегда получаю ошибки, например:

sed: -e expression #1, char 90: unterminated `s' command
sed: -e expression #1, char 20: unknown option to `s'

Я не так разбираюсь в sed, но я могу нормально заменить текстовые строки. Но я думаю из-за символов в текущей строке, например |, < и > это работает не так, как я.

Может кто-нибудь дать мне рабочий пример того, как заменить вышеперечисленное? Или укажите мне правильное направление.

Я сам пробовал следующее:

sed -i 's<VirtualHost |IP|:|PORT_80| |MULTI_IP|>/<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>' /virtual_host2.conf

sed -i 's|<VirtualHost |IP|:|PORT_80| |MULTI_IP|>|<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>|g' /virtual_host2.conf

Но оба дают ошибку, как указано выше.

Любая идея?

Вы опускаете / в sed 's///' шаблон. Попробуй это:

sed 's/<VirtualHost |IP|:|PORT_80| |MULTI_IP|>/<VirtualHost 127.0.0.1:8080 |IP|:8080 |MULTI_IP|>/' /virtual_host2.conf

И если все в порядке, добавьте -i возможность выполнить настоящую замену в файле.

g вариант в 's///g' pattern выполняет глобальную замену всех вхождений, а не первого в каждой строке.


В качестве разделителя можно использовать и другие символы, например 's|||', но в вашем примере это не имеет смысла, потому что вам нужно процитировать каждый | условное обозначение. Эта команда получит тот же результат:

sed 's|<VirtualHost \|IP\|:\|PORT_80\| \|MULTI_IP\|>|<VirtualHost 127.0.0.1:8080 \|IP\|:8080 \|MULTI_IP\|>|' /virtual_host2.conf