Существует несколько различных команд rename
(или prename
), доступных в различных дистрибутивах Linux, которые будут обрабатывать подстановки регулярных выражений.
Но вы также можете использовать расширенную глобализацию Bash, чтобы сделать кое-что из этого. Шаблон ${var//+([-_ ])/-}
говорит о необходимости замены любых серий одного или нескольких символов, перечисленных в квадратных скобках, одним дефисом.
shopt -s extglob
# demonstration:
for file in test---file 'test file' test______file teeesst--ffile test555----file__
do
echo "${file//+([-_ ])/-}"
done
Выход:
test-file
test-file
test-file
teeesst-ffile
test555-file-
Расширенный глобус +()
похож на .+
в регулярном выражении. Другие расширенные шары Bash (от man bash
):
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns
Обратите внимание, что последний дефис здесь не удаляется, но может использоваться расширение дополнительного параметра:
file=${file/%-/}
, который говорит удалить дефис в конце строки.