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 来做到这一点,我也想知道它。
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)