Em primeiro lugar, devo dizer que a maneira mais fácil de fazer isso é usar os comandos prename ou rename.
No Ubuntu, OSX (pacote Homebrew rename
, pacote MacPorts p5-file-rename
) ou outros sistemas com renomeação perl (prename):
rename s/0000/000/ F0000*
ou em sistemas com renomeação de util-linux-ng, como RHEL:
rename 0000 000 F0000*
Isso é muito mais compreensível do que o comando sed equivalente.
Mas quanto à compreensão do comando sed, a página de manual do sed é útil. Se você executar man sed e pesquisar por & (usando o comando / para pesquisar), você encontrará um caractere especial em s / foo / bar / reposições.
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.
Portanto, \(.\)
corresponde ao primeiro caractere, que pode ser referenciado por \1
. Em seguida, .
corresponde ao próximo caractere, que é sempre 0. Em seguida, \(.*\)
corresponde ao restante do nome do arquivo, que pode ser referenciado por \2
.
A string de substituição coloca tudo junto usando &
(o nome do arquivo original) e \1\2
que é todas as partes do nome do arquivo, exceto o segundo caractere, que era um 0.
Esta é uma maneira bastante enigmática de fazer isso, IMHO. Se por algum motivo o comando rename não estivesse disponível e você quisesse usar o sed para renomear (ou talvez estivesse fazendo algo muito complexo para renomear?), Ser mais explícito em sua regex o tornaria muito mais legível. Talvez algo como:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
Ser capaz de ver o que está realmente mudando em s / search / replacement / torna-o muito mais legível. Além disso, ele não continuará sugando caracteres de seu nome de arquivo se você acidentalmente executá-lo duas vezes ou algo assim.