sostituendo il punto nella stringa, ma lasciando l'ultimo


1

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
$


1
Cross-postato su ServerFault: serverfault.com/questions/223402/...
Bobby

Risposte:


2

Fare un tentativo:

echo 'someth.ing.something.txt' | sed 's/\(.*\)\.\([^.]*\)$/\1\n\2/;s/\./-/g;s/\n/./g'

Mi piace lanciare il carattere "marcatore" extra per l'ultimo punto lì dentro in modo da non perderlo. Dovrò ricordare quel trucco.
jwernerny

1
#!/bin/bash

F=$1
tail=${F#*.}
head=${F%.*}
removed_dots=$(echo $head| tr "." "-")
mv -iv $1 "$removed_dots.$tail"

Probabilmente lo vuoi 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.
Dennis Williamson

@Dennis - Sei il benvenuto per migliorarlo. Non ho imparato da tutte le cose belle che puoi fare ${ ... } ancora.
Nifle

0

Prova con:

echo 'someth.ing.something.txt' | sed 's/\./-/g;s/\(.*\)-\([^-]*\)$/\1.\2/'

Non riesce a echo 'someth.ing.something.t-xt'.
Dennis Williamson

0

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.


sì, vai con cyrus, =)
madmaze
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.