Experimente:
echo 'someth.ing.something.txt' | sed 's/\(.*\)\.\([^.]*\)$/\n/;s/\./-/g;s/\n/./g'
substitua o "." [pontos], mas deixe o último: por exemplo: .txt [pode haver um número aleatório de pontos na cadeia, até zero, eu preciso apenas do último]]
$ echo 'someth.ing.something.txt' | SOMEMAGIC
someth-ing-something.txt
$
Experimente:
echo 'someth.ing.something.txt' | sed 's/\(.*\)\.\([^.]*\)$/\n/;s/\./-/g;s/\n/./g'
#!/bin/bash
F=$1
tail=${F#*.}
head=${F%.*}
removed_dots=$(echo $head| tr "." "-")
mv -iv $1 "$removed_dots.$tail"
Experimente:
echo 'someth.ing.something.txt' | sed 's/\./-/g;s/\(.*\)-\([^-]*\)$/./'
Tenho certeza que existe uma maneira melhor (regex), mas você poderia escrever um script (python / perl) que pega leituras de stdin e encontra o último ponto, divide em filename + extension e então substitui todos os pontos por traços no nome do arquivo.
No final, concatene-o e cuspa-o novamente.
Tags linux