Как восстановить значение из регулярного выражения

226
AFP_555

Я не уверен, правильно ли я спрашиваю, или это вообще возможно. Я хочу изменить имя некоторых файлов, используя их собственное имя.

Давайте предположим, что у меня есть file1, file2 и file3. Я хочу сделать что-то вроде:

mv file* file_xyz 

Чтобы получить: file1_xyz, file2_xyz и file3_xyz

0

1 ответ на вопрос

1
grawity

Существуют инструменты, которые могут применять поиск и замену регулярных выражений ко всему имени файла, например perl-rename(также часто называемый prename). В таких инструментов, вы бы соответствовать несколько цифр с \d+или [0-9]+внутри «захвата группы» (круглые скобки), и ссылаться на него позже $1или в \1зависимости от программы.

Например:

prename -v 's/file(\d+)$/file$1_xyz/' file[123]  prename -v 's/(file\d+)$/$1_xyz/' file[123] 

( -vОпция заставляет предварительное имя распечатывать изменения. Вы можете использовать -nдля распечатки изменений, фактически не переименовывая ничего.)

Вы также можете добиться этого, используя только mvи sed:

for old in file[123]; do new=$(sed -r 's/file([0-9]+)$/file\1_xyz/' <<< "$old") mv -v "$old" "$new" done 

Но если вы посмотрите внимательно, вам на самом деле не нужен номер. Все, что вы делаете, так или иначе добавляете некоторый статический текст, например так:

prename 's/$/_xyz/' file[123]  for f in file[123]; do mv "$f" "$_xyz" done 

Похожие вопросы