Seu problema tem a ver com a ganância de .*
. Você ainda pode fazer isso em sed
, mas é mais fácil com o Perl:
$ echo 'range 1.1.1.10 1.1.1.100;' | perl -ne 'printf("IP range is %d-%d\n", (/\.(\d+)[^.]/g))'
IP range is 10-100
O script Perl corresponde aos números no final dos endereços IP e os retorna como dois inteiros que são usados em printf()
para imprimir a string de saída formatada.
A expressão regular Perl
/\.(\d+)[^.]/g
irá capturar cada conjunto de dígitos precedido por um ponto, mas não seguido por um ponto.
Em sed
você não precisa fazer a substituição de uma só vez:
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);//'
range 1.1.1.10 100
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);//' -e 's/[^ ]*\.([0-9]+) /-/'
range 10-100
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+);//' -e 's/[^ ]*\.([0-9]+) /-/' -e 's/range/IP & is/'
IP range is 10-100
O script final sed
:
s/[^ ]*\.([0-9]+);//; # Isolate last number in range
s/[^ ]*\.([0-9]+) /-/; # Isolate first number in range, add dash
s/range/IP & is/; # Sort out text at start
Que, sob inspeção, pode ser encurtado para
s/[^ ]*\.([0-9]+)[^.]/-/g
s/range -/IP range is /
Isso é
$ echo 'range 1.1.1.10 1.1.1.100;' | sed -E -e 's/[^ ]*\.([0-9]+)[^.]/-/g' -e 's/range -/IP range is /'
IP range is 10-100