Я не использую tr
достаточно часто, чтобы иметь возможность комментировать tr -d ' '
, но остальные ваши проблемы можно решить с помощью правильного регулярного выражения. На самом деле, если вы используете sed
, вы можете добавить регулярное выражение для удаления пробелов и устранить необходимость в tr
:
sed -r -e 's/ +//g' -e 's/^[0-9]*[_-]*(.+\.mp3)$/\1/I'
Опция -r
указывает sed
включить расширенный режим, чтобы можно было использовать «новые» функции, такие как модификатор +
. Каждое регулярное выражение, следующее за -e
, будет применено к каждой строке в указанном порядке.
Первый заменяет один или несколько (+
) пробелов ничем, для всех совпадений (g
), а не только для первого.
Второе регулярное выражение соответствует любой строке, начинающейся с цифры (квадратные скобки обозначают набор символов для сопоставления, а -
обозначает диапазон в наборе). *
означает «соответствует нулю или более предшествующего символа». Круглые скобки используются для «группировки» части совпадения для последующего использования. .+
соответствует всем оставшимся символам, а \.mp3
соответствует расширению имени файла (.
экранируется обратной косой чертой, поскольку обычно это означает «любой символ», но нам нужен литерал .
). \1
в строке замены указывает первую (и единственную, в данном случае) группу. Наконец, модификатор I
указывает на то, что при совпадении регистр не учитывается.
Есть много лотов или регулярных выражений онлайн, если вы хотите узнать больше. Урок по регулярным выражениям Perl особенно хорош (и большинство движков регулярных выражений в значительной степени совместимы с Perl).