sed – * работает, + не работает?

Я переименовываю кучу музыкальных файлов, убираю номера треков с помощью sed. Однако я озадачен поведением sed по отношению к символу ‘+’ для выражений регулярных выражений.

Что я хотел сделать:

for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9]+/\-/g'; done 

Но это не сработало как задумано. Этот обходной путь сделал работу:

 for f in *\-[0-9]**; do echo "$f" | sed 's/\-[0-9][0-9]*/\-/g'; done 

Однако я хотел бы знать, в чем проблема с использованием ‘+’ в sed … Есть идеи?

+ – это расширенный модификатор регулярного выражения. По умолчанию sed выполняет базовые регулярные выражения .

Чтобы sed анализировал ваши выражения как расширенные регулярные выражения, используйте sed -E . GNU sed также понимает + в основных регулярных выражениях, если вы используете его как \+ .

Также ваш паттерн *\-[0-9]** выглядит странно. - Не нужно экранировать (не в шаблоне оболочки и не в регулярном выражении), и если вы не используете globstar в bash , шаблон ** globstar сам по себе. При включенном globstar в bash *-[0-9]** расширится на все пути, содержащие -N в первом компоненте имени файла (где N – цифра).

Я думаю, что вы хотели бы сделать что-то вроде этого (возможно, не совсем, но я не знаю, как выглядят ваши имена файлов):

 for name in *-[0-9][0-9]*; do newname=${name%-*} printf 'Would rename "%s" into "%s"\n' "$name" "$newname" # mv "$name" "$newname" done 

Это соответствует всем именам в текущем каталоге, который содержит -NN ( N является цифрой). Он удаляет все с последнего - в имени файла и переименовывает файл (фактическое переименование закомментировано).