Во-первых, я должен сказать, что самый простой способ сделать это - использовать команды 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 / replace /, делает его более читаемым. Также он не будет высасывать символы из вашего имени файла, если вы случайно запустите его дважды или что-то в этом роде.