Para remover comentários de linhas que têm um IP começando com 10.4 (isso removerá o primeiro # , suponho que você nunca terá mais):
sed -i '/^#10\.4/{s/^#//}' /etc/hosts
Para adicionar um comentário a essas linhas:
sed -i '/^10\.4/{s/^/#/}' /etc/hosts
Então, por que a sua falha? Você estava usando c\ , o que significa:
c\
textDelete the lines matching the address or address-range, and output the lines of text which follow this command (each but the last ending with a \, which are removed from the output) in place of the last line (or in place of each line, if no addresses were specified). A new cycle is started after this command is done, since the pattern space will have been deleted.
Então, quando você executou sed -i '/#10\.4\..*/c\.4\..*' /etc/hosts , isso significava "substituir #10\.4\..* pela string literal #10\.4\..* ". O que você queria fazer é:
sed -i 's/#10\.4\.\(.*\)/10.4./' /etc/hosts'
O texto acima usa um operador de substituição ( s/from/to/ ) e captura de padrão, o primeiro padrão em \( \) pode ser referido como , o segundo como etc. Como você pode ver na resposta de Michael não é necessário, você pode simplesmente substituir #10.4 por 10.4 . Ou, como na minha resposta acima, você pode simplesmente remover o # sozinho.