По-перше, я повинен сказати, що найпростіший спосіб зробити це - використовувати команди prename або rename.
В Ubuntu, OSX (пакет Homebrew, пакет rename
MacPorts p5-file-rename
) або інших системах із перейменованням perl (попереднє ім'я):
rename s/0000/000/ F0000*
або на системах із перейменованням з util-linux-ng, таких як RHEL:
rename 0000 000 F0000*
Це набагато зрозуміліше, ніж еквівалентна команда sed.
Що стосується розуміння команди sed, корисною є сторінка sed. Якщо запустити man sed і шукати & (за допомогою команди / для пошуку), ви побачите, що це спеціальний символ у 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.
Отже, \(.\)
відповідає першому символу, на який можна посилатися \1
. Потім .
відповідає наступному символу, який завжди дорівнює 0. Потім \(.*\)
відповідає решті імені файлу, на яке можна посилатися \2
.
Рядок заміни складає все разом, використовуючи &
(оригінальне ім'я файлу), і \1\2
це кожна частина імені файлу, крім 2-го символу, який був 0.
Це досить загадковий спосіб зробити це, ІМХО. Якщо з якихось причин команда перейменування була недоступна, і ви хотіли використовувати sed для перейменування (або, можливо, ви робили щось занадто складне для перейменування?), Точніше вираження у вашому регулярному виразі зробило б його набагато зручнішим для читання. Можливо щось на зразок:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
Можливість побачити, що насправді змінюється в s / search / replacement /, робить його набагато зручнішим для читання. Крім того, він не буде висмоктувати символи з вашого імені файлу, якщо ви випадково запустите його двічі або щось інше.