次のように、フルパスからファイル名部分を抽出します。
PATH=/a/b/c/foo.o #1
BASE=${PATH##*/} #2
BASE=${BASE/%.o/-1234.o} #3
echo "$BASE"
#2と#3をマージする方法はありますか?試みるたびにbad substitution
bashで何らかのエラーが発生します。
答え1
はい、すべて変数名が必要なため、代替項目を入れ子にすることはできません。
ただし、単一の呼び出しでこれを実行できますbasename
。
base="$( basename "$pathname" .o )-1234.o"
2番目のパラメータは、指定されたbasename
文字列から削除されるサフィックスです。
また、シェルスクリプトでPATH
変数に大文字を使用することは、本当に悪い考えです。これは、シェルがこの変数を使用して外部ユーティリティを見つけるためです。
スクリプトでは小文字の変数名を使用します。これは、シェルが他の目的に使用するシェル変数や環境変数との競合を防ぐのに役立ちます。
答え2
ファイル拡張子が不明な場合(動的) -sed選択する:
p="/a/b/c/foo.txt"
p=$(sed -E 's#.*/([^/]+)(\..*)$#\1-1234\2#' <<< "$p")
echo "$p"
foo-1234.txt