Você pode usar este comando awk :
awk 'BEGIN { printf "Enter the range: " ; getline r < "-"; split(r,a,"[ ,]")} \
{for (i in a){split(a[i],b,"-"); if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR)){print}}}' file
Explicação:
-
printf "Enter the range: " ; getline r < "-";copiado da pergunta (para ler a entrada do usuário na variávelr) -
split(r,a,"[ ,]")divide a entrada no espaço e vírgula dos delimitadores e grava-os no arraya. -
for (i in a)Para cada linha awk processa, faz um loop pelo arraya-
split(a[i],b,"-")cada elemento emaé dividido novamente no delimitador-e o intervalo é salvo na matrizb. -
if(a[i]==NR||(b[2]!=""&&b[1]<=NR&&b[2]>=NR))se o número da linhaawkestiver processando atualmente na matrizaou se o número da linha estiver entre os dois números na matrizb...-
{print}... imprima a linha.
-
-
Você também pode usar entradas combinadas como
1-3,4 5 7-13