Извлечь имя файла и заменить

Я извлекаю часть имени файла из полного пути следующим образом:

PATH=/a/b/c/foo.o #1 BASE=${PATH##*/} #2 BASE=${BASE/%.o/-1234.o} #3 echo "$BASE" 

Есть ли способ объединить # 2 и # 3? Всякий раз, когда я пытался, я получил какую-то bad substitution ошибку bad substitution от bash

Да, вы не можете вложить замены, поскольку для обоих из них требуется имя переменной.

Однако вы можете сделать это за один вызов в basename :

 base="$( basename "$pathname" .o )-1234.o" 

Второй аргумент basename – это суффикс, который будет удален из данной строки.


Также обратите внимание, что использование прописной буквы PATH в качестве переменной в скрипте оболочки – действительно плохая идея , так как эта переменная используется оболочкой для поиска внешних утилит.

Используйте имена строчных переменных в сценариях. Это помогает избежать столкновений с переменными оболочки и переменными среды, которые оболочка использует для других целей.

Если расширение файла неизвестно (динамическое) – sed альтернативный:

 p="/a/b/c/foo.txt" p=$(sed -E 's#.*/([^/]+)(\..*)$#\1-1234\2#' <<< "$p") echo "$p" foo-1234.txt