Apenas para o Bash:
# VERSION 1
while IFS=$'-' read -a line
do
printf '%s %s\n' ${line[@]}
done < infile > outfile
ou ...
# VERSION 2
main(){
local IFS=$'-\n'
local a=( $(<infile) )
printf '%s %s\n' ${a[@]} > outfile
}
main
ou ...
# VERSION 3
while IFS= read -r line
do
printf '%s\n' "${line/-/ }"
done < infile > outfile
Mas cuidado: veja esta postagem se estiver pensando em aplicar isso em arquivos grandes.
Por diversão, alguns benchmarks em um arquivo de tamanho moderado. Os resultados seguem; 'tr' é claramente a melhor escolha, seguida por sed e depois awk. O melhor Bash é a versão 2 (625 vezes mais lenta que tr e uso de memória 82 vezes maior). Por comparação, o sed é 7,5 vezes mais lento e o awk é 9 vezes mais lento que o tr.
$ stat -c %s bigdata.txt && wc -l bigdata.txt
1439952
179994 bigdata.txt
# tr '-' $' ' < "$1" > tr.txt
CPU TIME AND RESOURCE USAGE OF './tr bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS
CPU, sec : 0.02
CPU, pct : 97.10
RAM, kb : 1390.00
# sed 's/-/ /g' < "$1" > sed.txt
CPU TIME AND RESOURCE USAGE OF './sed bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS
CPU, sec : 0.15
CPU, pct : 98.90
RAM, kb : 1386.80
# awk 'BEGIN{FS="-"} ; { print $1,$2 }' "$1" > awk.txt
CPU TIME AND RESOURCE USAGE OF './awk bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS
CPU, sec : 0.18
CPU, pct : 98.80
RAM, kb : 1402.00
# BASH: VERSION 1
CPU TIME AND RESOURCE USAGE OF './bash_1 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS
CPU, sec : 16.35
CPU, pct : 99.00
RAM, kb : 1486.40
# BASH: VERSION 2
CPU TIME AND RESOURCE USAGE OF './bash_2 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS
CPU, sec : 12.51
CPU, pct : 99.40
RAM, kb : 114002.40
# BASH: VERSION 3
CPU TIME AND RESOURCE USAGE OF './bash_3 bigdata.txt'
VALUES ARE THE AVERAGE OF ( 10 ) TRIALS
CPU, sec : 15.45
CPU, pct : 99.00
RAM, kb : 1484.00