#ssh #sed #nested
#ssh #sed #вложенный
Вопрос:
Мне нужно изменить файл Python на удаленном сервере, и я застрял при форматировании команды sed внутри ssh.
Файл, который нужно изменить, содержит эту строку
my_list = ["item1"]
и мне нужно изменить его, чтобы включить другой элемент:
my_list = ["item1", "item2"]
Вот что у меня есть:
ssh user@host 'sed -i 's/my_list = [\"item1\"]/my_list = [\"item1\", \"item2\"]/' path/to/file'
Количество экранирований, требуемых для кавычек и открытых скобок, сбивает меня с толку, поскольку оно находится в ssh. Я был бы признателен, если кто-нибудь может помочь!
Ответ №1:
Вы не можете заключать одинарные кавычки и не можете экранировать одинарные кавычки внутри одинарных кавычек. Самое простое решение в данном конкретном случае — просто указывать меньше; в sed
or нет ничего -i
, что требует кавычек. Но поскольку командную строку обрабатывает как ваша локальная оболочка, так и удаленная оболочка, вам нужны два уровня цитирования.
ssh user@host sed -i "'s/my_list = \["item1"]/my_list = ["item1", "item2"]/'" path/to/file
Возможно, обратите внимание также, что строка замены — это просто строка, поэтому нет необходимости экранировать [
там.
Для отладки этих вещей попробуйте
ssh user@host printf '%s\n' sed -i "'s/my_list = \["item1"]/my_list = ["item1", "item2"]/'" path/to/file
чтобы увидеть, как командная строка разделяется на один токен на строку на удаленном хосте.
По сути, вам, вероятно, следует изменить удаленный скрипт Python, чтобы читать его входные данные в стандартном формате, таком как JSON или YAML. Программы, которые пишут программы, являются мощным инструментом, но простые программы, которые изменяют существующие программы, часто оказываются хрупкими и трудными для отладки.