Solução de corte baseada em colunas fixas - tamanho fixo - posição de caractere fixo:
$ cut --output-delimiter='-' -c7-19,20-21 file.txt
# display from char 7 up to 19, then print output delimiter, then display from char 20 up to char 21.
Solução de bash:
$ while IFS= read -r line;do line="${line:6:13}-${line:14:2}";echo $line;done<file.txt
Solução baseada em campos e não em caracteres:
while IFS= read -r line;do
line=$(cut -d' ' -f5- <<<"$line") #with space delimiter get field 5 up to the end
line=$(cut -d- -f1-4 <<<"$line") #with delimiter="-" get field 1 up to 4
line=$(sed "s/${line: -2}/-${line: -2}/g" <<<"$line") #insert a dash before last two characters
echo "$line"
done<file
Como one-liner com substituição de processo:
$ sed 's/..$/-$ cut --output-delimiter='-' -c7-19,20-21 file.txt
# display from char 7 up to 19, then print output delimiter, then display from char 20 up to char 21.
/g' <(cut -d- -f1-4 <(cut -d" " -f5- file.txt)) #use >newfile at the end to send the results to a new file
Em todos os casos, o resultado é o esperado, considerando o seu arquivo de entrada (e incluindo # 1
no início de cada linha)