2014-10-14 2 views
1

Я новичок в bash и изучаю электроинструменты sed, awk и многие другие, что предлагает эта платформа. В моем linux box у меня есть музыкальный каталог, содержащий подкаталоги. Эти подкаталоги имеют верхний индекс в названии. Я пытаюсь сделать все папки внутри этого музыкального каталога в нижнем регистре и вырезать интервал. За исключением того, что вы не изменяете ничего, что приходит после последнего дефиса, отличного от того, чтобы разбить пробел в имени подкаталога. Файл может иметь много дефис. Я просто принимаю во внимание последний. Как я могу это сделать?Имена каталогов - Удаление пробелов и другое форматирование

while read -r file; do 
    new_file=$(echo "$file" | sed -re 's/^([^-]*)-\s*([^\.]*)/\L\1\E-\2/' -e 's/ /_/g' -e 's/_-/-/g') 
     if [ "$file" != "$new_file" ]; then 
       mv "$file" "$new_file" 
     fi 
done 

Например:

ввода

New- Survivor - Eye Of The Tiger – 12wOlL 

Желаемый результат:

new-survivor_-_ eye_of_the_tiger-12wOlL 

Текущий результат:

new-Survivor_-_ Eye_of_The_Tiger-12wOlL 
+2

Вам нужно уточнить правила преобразование немного больше. Почему «New-Survivor» стал «новым выжившим», но «Survivor-Eye» стал «выжившим _-_ глаз», а снова «Tiger-12wOlL» стал «tiger-12wOlL». Когда пробел после '-' должен быть преобразован в' _' и когда его следует удалить? – anubhava

+0

@anubhava Я добавляю 'New-' все остальное исходное имя файла. Вот почему другие дефисы окружены подчеркиванием. Исключением является первый и последний дефис –

ответ

1

Вы можете использовать эту sed команду:

s='New- Survivor - Eye Of The Tiger - 12wOlL' 
echo "$s" | sed 's/^\(.*\)\(-[^-]*\)$/\L\1\E\2/; s/ *- */-/; s/^\(.*\) \+- *\([^-]*\)$/\1-\2/; s/ /_/g' 
new-survivor_-_eye_of_the_tiger-12wOlL 
1

Изменение SED команды, как показано ниже,

$ echo 'New- Survivor - Eye Of The Tiger – 12wOlL' | sed -re 's/^([^-]*-)\s*([^–]*)\s*–/\L\1\L\2–/;s/ /_/g;s/_-_/_-_ /g;s/_–_/-/g' 
new-survivor_-_ eye_of_the_tiger-12wOlL 
Смежные вопросы