Bash-скрипт, sed с двумя переменными не работает

#bash

#bash

Вопрос:

Я пишу скрипт, который время от времени меняет IP-адрес, но по какой-то причине я просто не могу заставить это работать

sed "s/$curLine/$nextLine/" </etc/network/interfaces>/etc/network/interfaces.new даже если я изменю end / g, я всегда буду получать «команду sed unterminated»s»»

Вот мои переменные $ curLine и $ nextLine:

 #Find current ip from /etc/network/interfaces

    curLine=$(sed -n "/address/p" /etc/network/interfaces)

#Find location of current ip in ips.txt.

    newLine=$(sed -n "/$curLine/=" ips.txt)

#Check and set next ip

    nextIP=$(($newLine 1))

    nextLine=$(sed -n "$nextIP,/address/p" ./ips.txt)
 

по какой-то причине $ nextLine также дает мне два IP-адреса, я не знаю почему, потому что в начале ot работал просто отлично.

и, в конце концов, это строка, которая не работает так, как должна.

 "s/$curLine/$nextLine/" </etc/network/interfaces>/etc/network/interfaces.new
 

сообщение об ошибке «sed unterminated `s’ command». Если я заменю $nextline текстом типа «адрес xxx.xxx.xxx.xx, он работает просто отлично.

Я прочитал так много тем, где решением было использовать двойные кавычки, но я не знаю, почему это не работает со мной. У меня также есть книга, в которой приведен пример, который в основном совпадает с тем, что я делаю, но опять же он не работает, когда я пытаюсь его использовать.

Спасибо!

Ответ №1:

Синтаксис для арифметики не имеет дополнительного символа:

 NUM=1
OTHERNUM=$((NUM   1))
#        ^^^^^^^^^^^^
 

Другими словами, скажем nextIP=$((newLine 1)) .

Комментарии:

1. Я не уверен, что я понял, что вы имеете в виду. Теперь я изменился nextIP=$((newLine 1)) , и nextLine=$(sed -n "$nextIP,/address/p" ips.txt) все же по какой-то причине я получил два ip: s после следующего: echo 'Next line '$nextLine и снова «unterminated `s’ команда»

2. Вы уверены, что можете перейти $curLine в sed команду без какого-либо экранирования? Вы сначала пробовали это вручную в командной строке?

3. Да, кажется, это работает, по крайней мере, когда я повторяю $ curLine, он выдает мне IP-адрес из интерфейсов, и он правильный как » адрес xxx.x.xx.xxx. my ips.txt также включите IP-адреса, отформатированные как «адрес xxx …», и я пытаюсь заменить адресную строку интерфейса на ips.txt адресстрока.

4. Как насчет эха $newLine ?

5. $newLine указывает текущую позицию ip в ips.txt это строка 1, и это правильно. Затем в моем $ nextIP указано «Следующая позиция подсказки, которая будет использоваться: 2», что означает строку 2 в ips.txt . После этого по какой-то причине $ nextLine выдает мне два адреса «адрес ххх … адрес гггг …» Я предположил, что «sed -n «$nextIP,/address/p» ./ips.txt » следует выбрать первый адрес xxx .. в строке $ nextIP, верно?

Ответ №2:

Проблема решена. Я только что изменил

 nextLine=$(sed -n "$nextIP,/address/p" ./ips.txt)
 

для поиска диапазона строк вместо конкретной строки с шаблоном.

 nextLine=$(sed -n "$nextIP,/$nextIP" ./ips.txt)