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)
| 归档时间: |
|
| 查看次数: |
2565 次 |
| 最近记录: |