Скрипт bash: удаляет числа из имени файла между "-" и "_" - PullRequest
1 голос
/ 17 мая 2019

Мне нужно удалить серийный номер в имени моего файла, который находится между - и _ (подчеркивание также должно быть удалено).

Исходное имя файла: 20190815-12345_table_file.rar

Ожидаемый: 20190815-table_file.rar

Мой код bash:

for f in ./*.rar;
do fn=`echo $f|sed 's/^-[0-9].*_$/-/g'`;
mv "$f" "$fn";
done;

Я пробовал что-то подобное, потому что я знаю, что мои номера начинаются с "-" (поэтому ^) - это числа ([0-9]. *) И заканчиваются на "_" (так что $), и я хочу заменить цифры на "-".

Но с этим методом он не работает.

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Вы regex для sed не соответствует желаемому: разделители начала и конца являются якорями начала и конца строки.Кроме того, вы хотите [0-9]* без точек для любого количества цифр.

Попробуйте вместо этого:

for f in ./*.rar; do
  fn="$( sed 's/-[0-9]*_/-/g' <<<"$f" )"
  mv "$f" "$fn"
done

В bash вы можете использовать расширение параметра для замены без sed;Я забыл точный синтаксис, поэтому пока оставлю его и добавлю позже.Проверьте man bash для деталей.

1 голос
/ 17 мая 2019

Все решения Bash:

for f in ./*.rar; do
  mv "$f" "${f/-*([0-9])_/-}"
done

Для работы шаблона *() должна быть включена опция оболочки extglob с shopt -s extglob.

См. Справочное руководство Bash или этот ответ для получения дополнительной информации о том, как работает расширение параметра.

...