Во-первых, я должен сказать, что самый простой способ сделать это - использовать
команды prename или rename.
В Ubuntu, OSX (пакет Homebrew rename
, пакет MacPorts p5-file-rename
) или других системах с переименованием perl (prename):
rename s/0000/000/ F0000*
или в системах с переименованием из util-linux-ng, таких как RHEL:
rename 0000 000 F0000*
Это гораздо более понятно, чем эквивалентная команда sed.
Но для понимания команды sed полезна man-страница 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 / делает его намного более читабельным. Также это не будет держать
высасывая символы из вашего имени файла, если вы случайно запустили его
дважды или что-то.