Eu usaria um loop for para passar os meses necessários, para 1 a 12 é:
var='<table>\n<tr><th colspan="7">'
for i in {1..12}; do
cal -hm$i | sed '1{s|^|'"${var}"'|;s|$|</th></tr>|};2,${s|\(..\) |<td></td>|g;s|^|<tr>|;s|$|</tr>|};$s|$|\n</table>|' >>file.html
done
Isso funciona em 16.04. Como apontado por outros nos comentários e confirmado por a man page , em 17.10 (et seqq.) cal não tem mais a opção -h . Você pode usar ncal , consulte man cal para obter detalhes.