Использование sed через ssh для добавления элемента в список

#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. Программы, которые пишут программы, являются мощным инструментом, но простые программы, которые изменяют существующие программы, часто оказываются хрупкими и трудными для отладки.