变量中的纯壳复合替换

rus*_*ush 3 shell bash ksh variable-substitution

有什么方法可以一次替换多个模式的变量中的文本,甚至使用反向引用?

例如,我有FILE=filename.ext并且我想将其更改为filename_sometext.ext. 但我不知道文件扩展名是.ext. 我所知道的是扩展名在最后一个点之后。所以我可以分两步完成:

EXT=${FILE##*.}
FILE=${FILE%.*}_sometext.$EXT
Run Code Online (Sandbox Code Playgroud)

我可以一步完成吗(类似${FILE/.\(*\)/_sometext.\1}[那行不通])?

顺便说一句,我需要在没有sed/ awk/etc 的纯 shell 中执行此操作。我的外壳是ksh,但如果有办法用 bashisms 来做到这一点,我也想知道它。

Mik*_*kel 5

Bash Parameter Expansion表示变量(FILE在您的示例中)必须是参数名称。所以它们不筑巢。并且最后一部分${param/pattern/replacement}必须是一个字符串。所以不支持反向引用。

我唯一的建议是使用

${EXT:+.$EXT}
Run Code Online (Sandbox Code Playgroud)

如果文件没有扩展名,则避免添加尾随点。


更新

显然ksh93支持反向引用。

所以你可以使用类似的东西

FILE="${FILE/@(.*)/_something\1}"
Run Code Online (Sandbox Code Playgroud)