Решение с использованием awk
(@glenn jackman, вероятно, опубликует что-то, что делает это менее чем за 5 строк):
# join.awk --- join an array into a string
function join(array, start, end, sep, result, i)
{
if (sep == "")
sep = " "
else if (sep == SUBSEP) # magic value
sep = ""
result = array[start]
for (i = start + 1; i <= end; i++)
result = result sep array[i]
return result
}
function range(input) {
split(input, a, "[(-)]")
# [1] is startvalue, [2] is start and stop for range
split(a[2], b, "-")
# [1] is start range, [2] is stop range
# create 1st number by appending start range to start value
c[1] = a[1] b[1]
n=2
for(i=b[1]; i<=b[2]; i++){
c[n] = c[n-1] + 1
n++
}
return join(c, 1, b[2], ",")
}
# a line containing a -
/-/ {
for(i=1;i<=NF;i++){
if ($i ~ /-/) {
printf("%s,", range($i))
}
printf("%s,", $i)
}
print ""
}
!/-/{print}