Я пытаюсь заменить строку на 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