Может быть недостаточно надежным, но если шаблон такой же, можно сделать решение PE.
var2='*.'
var=abcd-efj-klmnop-3.7.1.txt;
echo "${var%-*}"$var2"${var##*.}"
Должно напечатать.
abcd-efj-klmnop*.txt
"$ { var% - } " удаляет последнюю точку. в конце удаляет расширение .txt . "$ {var ## .}" удаляет самое длинное совпадение в начале, оставляя только расширение txt.
Приведенное выше решение также убрало трейлинг - да sh, который необходим. либо просто добавьте da sh перед "$ var", либо добавьте его в задание, либо это
var2='*.'
var=abcd-efj-klmnop-3.7.1.txt;
echo "${var%%-[0-9]*}$var2${var##*.}"