Po pierwsze, powinienem powiedzieć, że najłatwiej to zrobić, używając poleceń prename lub rename.
W systemie Ubuntu, OSX (pakiet Homebrew, pakiet rename
MacPorts p5-file-rename
) lub innych systemach ze zmianą nazwy perl (prename):
rename s/0000/000/ F0000*
lub w systemach ze zmianą nazwy z util-linux-ng, takich jak RHEL:
rename 0000 000 F0000*
To o wiele bardziej zrozumiałe niż równoważne polecenie sed.
Ale jeśli chodzi o zrozumienie polecenia sed, pomocna jest strona podręcznika sed. Jeśli uruchomisz man sed i wyszukasz & (używając polecenia / do wyszukiwania), znajdziesz to specjalny znak w s / foo / bar / replaceements.
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.
Dlatego \(.\)
dopasowuje pierwszy znak, do którego można się odwoływać \1
. Następnie .
dopasowuje następny znak, którym jest zawsze 0. Następnie \(.*\)
dopasowuje resztę nazwy pliku, do której można się odwoływać \2
.
Ciąg zastępujący łączy to wszystko razem za pomocą &
(oryginalna nazwa pliku), \1\2
która jest każdą częścią nazwy pliku z wyjątkiem drugiego znaku, który był 0.
To dość tajemniczy sposób, IMHO. Jeśli z jakiegoś powodu polecenie rename nie było dostępne i chciałbyś użyć seda do zmiany nazwy (a może robiłeś coś zbyt złożonego do zmiany nazwy?), Bardziej wyraźne wyrażenie w swoim wyrażeniu regularnym uczyniłoby go znacznie bardziej czytelnym. Może coś takiego:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
Możliwość zobaczenia, co faktycznie się zmienia w s / wyszukiwaniu / zamianie / sprawia, że jest on znacznie bardziej czytelny. Ponadto nie będzie wysysać znaków z nazwy pliku, jeśli przypadkowo uruchomisz go dwa razy lub coś w tym stylu.