Innanzitutto, dovrei dire che il modo più semplice per farlo è usare i comandi prename o rinomina.
Su Ubuntu, OSX (pacchetto Homebrew rename
, pacchetto MacPorts p5-file-rename
) o altri sistemi con rinomina perl (prename):
rename s/0000/000/ F0000*
o su sistemi con rinomina da util-linux-ng, come RHEL:
rename 0000 000 F0000*
È molto più comprensibile rispetto al comando sed equivalente.
Ma per quanto riguarda la comprensione del comando sed, la manpage sed è utile. Se esegui man sed e cerchi & (usando il comando / per cercare), troverai che è un carattere speciale in s / foo / bar / replacements.
s/regexp/replacement/
Attempt to match regexp against the pattern space. If success‐
ful, replace that portion matched with replacement. The
replacement may contain the special character & to refer to that
portion of the pattern space which matched, and the special
escapes \1 through \9 to refer to the corresponding matching
sub-expressions in the regexp.
Pertanto, \(.\)
corrisponde al primo carattere, a cui è possibile fare riferimento \1
. Quindi .
corrisponde al carattere successivo, che è sempre 0. Quindi \(.*\)
corrisponde al resto del nome del file, a cui può fare riferimento\2
.
La stringa di sostituzione mette tutto insieme usando &
(il nome del file originale) e \1\2
che è ogni parte del nome del file tranne il 2 ° carattere, che era uno 0.
Questo è un modo piuttosto criptico per farlo, IMHO. Se per qualche motivo il comando rename non fosse disponibile e volessi usare sed per fare il rename (o forse stavi facendo qualcosa di troppo complesso per rinominare?), Essere più esplicito nella tua regex lo renderebbe molto più leggibile. Forse qualcosa come:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
Essere in grado di vedere cosa sta effettivamente cambiando nella s / ricerca / sostituzione / lo rende molto più leggibile. Inoltre non continuerà a risucchiare i caratteri dal tuo nome file se lo esegui accidentalmente due volte o qualcosa del genere.