Использование переменных в команде sed - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь заменить определенную строку в файле с помощью команды sed. Тем не менее, это не работает. Структура данных в моем файле:

"SomeServerName": {
    "serverIP": "192.168.0.132",
    "serverPort": "9999",
    "active": false
}

Здесь я хочу изменить статус active на true с false на основе IP, который является переменным входом, который я получаю с терминала.

Команда sed, которую я использовал:

sudo sed -i "s/$someIP/!b;n;n;c\ \ \ \ \ \ \ \ "active": true/" filename

Здесь, $someIP=192.168.0.132. В sed, если я заменю $ someIP на '192.168.0.132', все будет работать нормально. Однако, если я передам переменную, она не будет работать.

РЕДАКТИРОВАТЬ : Ниже приведен весь мой сценарий для вышеуказанного sed:

#! /bin/sh

someIP=$(hostname -I)
sudo sed -i "s/$someIP/!b;n;n;c\ \ \ \ \ \ \ \ "active": true/" filename

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Вот решение sed. Обратите внимание, что вам нужно использовать двойные кавычки "" для sed и избегать любых других двойных кавычек в строке поиска или замены.

 $ input_ip="192.168.0.132"
 $ sed -i "/$input_ip/{n;n;s/\"active\": false/\"active\": true/}" inputFile

Предполагается, что строка active: false появляется через две строки после $input_ip. n;n; пропускает две строки в конце $input_ip.

0 голосов
/ 07 сентября 2018

как насчет

sed -zE "s/($someIP[^\n]*\n[^\n]*\n[^\n]*\"active\": )false/\1true/g" filename

Вы не можете буквально "передать" переменную в sed. bash заменяет $ someIP в аргументе строкой, на которую он ссылается, перед тем, как запустить sed, т.е. это передача по значению.

имейте в виду, что $ someIP не только соответствует 192.168.0.132, но и 192: 168: 0: 132 или 1924168903132, потому что в sed '.' означает «любой символ», если вы не избежите этого.

эта команда будет работать до тех пор, пока между совпадающим IP-адресом и настройкой «активный» будет ровно две строки, а содержимое между ними не определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...