É possível, mas não elegante:
echo 'This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.' \
| sed 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*//'
[0-9]
corresponde a qualquer dígito, \{1,3\}
significa que ele pode ser repetido de 1 a 3 vezes. \.
corresponde a um ponto. O IP inteiro é capturado pelos \(...\)
parênteses, o que vem antes e depois é correspondido por .*
, ou seja, qualquer coisa repetida zero ou mais vezes. Toda a string correspondente (ou seja, a linha inteira) é então substituída pelo conteúdo do primeiro grupo correspondente.
Você pode torná-lo mais legível introduzindo uma variável:
n='[0-9]\{1,3\}'
... | sed "s/.*\($n\.$n\.$n\.$n\).*//"
Imprime toda a string se o IP não for encontrado. Ele também não verifica se há IPs inválidos, como 256.512.999.666.