2015-01-16 3 views
1

Я пишу скрипт Bash для извлечения номеров номеров из имен файлов. Имена файлов называются: part-number-N.jpg или part-number-NN.jpg, где «N» - это цифра.Bash script regex match 1 или 2 цифры

В этом скрипте «$ files» - это всего лишь список файлов в каталоге.

for f in $files; do 
    fileName=$(basename $f) 
    tmp=${fileName%.jpg} 
    partNo=${tmp%-[0-9]} 
done 

Как обновить этот скрипт, чтобы удалить дефис, за которым следует до двух цифр в конце строки?

+0

Многие из номера деталей имеют дефисы как часть номера, поэтому я не хочу удалять все g после дефиса (хотя все после последнего дефиса). – Reflexorozy

ответ

2

Вы можете использовать extended globs

shopt -s extglob 
partNo="${tmp%-[[:digit:]]?([[:digit:]])}" 

Кроме того, вы бы лучше служили хранения файлов в массиве (files=(file1 file2 "file with embedded spaces in name"..)) и цикл по массиву, как это - for file in "${files[@]}". Также двойные кавычки переменные Обильно

0

Late Ответ

Вы также можете использовать sed в пределах вашего цикла, чтобы манипулировать именами файлов:

for f in $files/*; do 
    newFile=$(basename $f | sed 's/-[0-9][0-9]*//') 
    echo $newFile 
done 

Выход

part-number-N.jpg -> part-number.jpg 
part-number-NN.jpg -> part-number.jpg 
+0

BTW, я немного смущен, вы хотели сохранить расширение? Мой код сохраняет его. – Bolboa

Смежные вопросы