Как я могу удалить запись Host из файла конфигурации ssh?

Стандартный формат файла:

Host example
  HostName example.com
  Port 2222
Host example2
  Hostname two.example.com

Host three.example.com
  Port 4444

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

Самое близкое, что у меня есть, это то, за исключением того, что мне нужно сохранить следующую декларацию хоста, а второй поисковый термин будет содержать два многих термина (например, HostName):

sed '/Host example/,/\nHost/d'

2 ответа

Решение

С GNU sed:

host="example"
sed 's/^Host/\n&/' file | sed '/^Host '"$host"'$/,/^$/d;/^$/d'

Выход:

Host example2
  Имя хоста two.example.com
Host three.example.com
  Порт 4444

s/^Host/\n&/: Вставлять новую строку перед каждой строкой, начинающейся с "Host"

/^Host '"$host"'$/,/^$/d: удалить все строки, соответствующие "Host $host", до следующей пустой строки

/^$/d: clean up: удалить каждую пустую строку

Мое окончательное решение (которое в некоторой степени ориентировано на OSX) заключалось в следующем. Во многом это основано на предыдущем ответе Кира.

sed < $SOURCE "/^$/d;s/Host /$NL&/" | sed '/^Host '"$HOST"'$/,/^$/d;' > $SOURCE

Это более устойчиво к HostName директивы, которые не имеют отступа.

Другие вопросы по тегам