sostituisci il "." [punti], ma lascia l'ultimo: per esempio: .txt [potrebbe esserci un numero casuale di punti nella stringa, anche zero, ho solo bisogno dell'ultima]
$ echo 'someth.ing.something.txt' | SOMEMAGIC
someth-ing-something.txt
$
sostituisci il "." [punti], ma lascia l'ultimo: per esempio: .txt [potrebbe esserci un numero casuale di punti nella stringa, anche zero, ho solo bisogno dell'ultima]
$ echo 'someth.ing.something.txt' | SOMEMAGIC
someth-ing-something.txt
$
Risposte:
Fare un tentativo:
echo 'someth.ing.something.txt' | sed 's/\(.*\)\.\([^.]*\)$/\1\n\2/;s/\./-/g;s/\n/./g'
#!/bin/bash
F=$1
tail=${F#*.}
head=${F%.*}
removed_dots=$(echo $head| tr "." "-")
mv -iv $1 "$removed_dots.$tail"
tail=${F##*.} (Due # ) e puoi farlo removed_dots=${head//./-} (non ce n'è bisogno tr ). Potresti anche riutilizzare la variabile head invece di usare una nuova variabile.
${ ... } ancora.
Prova con:
echo 'someth.ing.something.txt' | sed 's/\./-/g;s/\(.*\)-\([^-]*\)$/\1.\2/'
echo 'someth.ing.something.t-xt'.
Sono sicuro che c'è un modo migliore (regex), ma potresti scrivere uno script (python / perl) che prende le letture da stdin e trova l'ultimo punto, lo divide in nomefile + estensione e poi sostituisce tutti i punti con trattini nel nome del file.
Alla fine, concatenalo e sputalo di nuovo.