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 linhaawk
estiver processando atualmente na matriza
ou 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