Remove extensão específica (conhecida) do nome do arquivo se estiver lá

2

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?

    
por Tomáš Zato 06.10.2015 / 14:32

2 respostas

5

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}"
    
por 06.10.2015 / 14:39
0

Usando sua abordagem (existem soluções melhores):

echo name | grep -oP '^[^.]+(?=(\.ext)?$)'
    
por 06.10.2015 / 14:43