変数の純粋なシェル複合置換

変数の純粋なシェル複合置換

逆参照を使用しても、複数のパターンの変数のテキストを同時に置き換える方法はありますか?

たとえば、FILE=filename.extに変更したいのですがfilename_sometext.ext、ファイル拡張子が何であるかわかりません.ext。私が知っているのは、拡張子が最後の点の後ろにあるということだけです。したがって、2つのステップで行うことができます。

EXT=${FILE##*.}
FILE=${FILE%.*}_sometext.$EXT

1つのステップで完了できますか(例:${FILE/.\(*\)/_sometext.\1}[これは機能しません])?

sedしかし、/などのない純粋なawkシェルでこれを行う必要があります。私のシェルはですがksh、bashismsでこれを行う方法があればそれも知りたいです。

ベストアンサー1

Bash パラメータ拡張表現変数(FILE例では)はパラメータ名でなければなりません。だから彼らは巣を作らない。最後の部分は${param/pattern/replacement}文字列でなければなりません。したがって、逆参照はサポートされていません。

私の唯一の提案は、以下を使用することです。

${EXT:+.$EXT}

ファイルに拡張子がない場合に後ろにドットを追加したくない場合。


修正する

明らかに逆参照がサポートされていますクッシュ 93

だからあなたは次のようなものを使うことができます

FILE="${FILE/@(.*)/_something\1}"

おすすめ記事