How can I remove a Host entry from an ssh config f

2019-05-05 17:51发布

问题:

The standard format of the file is:

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

Host three.example.com
  Port 4444

Knowing the host's short name, I want to remove an entire entry in order to re-add it with new details.

The closest I have got is this, except I need to keep the following Host declaration and the second search term will capture two many terms (like HostName):

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

回答1:

With GNU sed:

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

Output:

Host example2
  Hostname two.example.com
Host three.example.com
  Port 4444

s/^Host/\n&/: Insert a newline before every line that begins with "Host"

/^Host '"$host"'$/,/^$/d: delete all lines matching "Host $host" to next empty line

/^$/d: clean up: delete every empty line



回答2:

My final solution (which is somewhat OSX orientated) was this. It's largely based on Cyrus' earlier answer.

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

This is more resilient to HostName directives which aren't indented.



标签: ssh sed