Você pode usar a substituição do shell POSIX para remover o .ext
:
file='name.ext'
printf '%s\n' "${file%.ext}"
Para atribuir a string livre de extensão a uma nova variável, faça
noext="${file%.ext}"
Eu nem tenho certeza se grep
deve ser usado para regex em dados de uma linha. O googling me levou a essa expressão lookahead que, junto com grep
, corresponde a qualquer arquivo .ext
e retorna um nome simples:
XX@XX:/$ echo name.ext | grep -oP [^\.]+(?=.ext)
name
Isso é bom, mas agora eu solicito ao usuário para salvar um arquivo e não tenho certeza se ele digitará o nome com a extensão ou não. Tentei tornar a lookahead condicional, garantindo que todos os nomes sejam correspondidos, mas isso retorna algo que não entendo:
XX@XX:/$ echo name.ext | grep -oP "[^\.]+(?=.ext)?"
name
ext
Funciona se eu omitir a extensão:
XX@XX:/$ echo name | grep -oP "[^\.]+(?=.ext)?"
name
Então, isso é um problema do grep ou do regex? Talvez eu precise, de alguma forma, fazer a antecipação da não captura?
Usando sua abordagem (existem soluções melhores):
echo name | grep -oP '^[^.]+(?=(\.ext)?$)'