Bash
變數中的純殼複數替換
有什麼方法可以一次替換多個模式的變數中的文本,甚至使用反向引用?
例如,我有
FILE=filename.ext
並且我想將其更改為filename_sometext.ext
. 但我不知道文件副檔名是.ext
. 我所知道的是擴展是在最後一個點之後。所以我可以分兩步完成:EXT=${FILE##*.} FILE=${FILE%.*}_sometext.$EXT
我可以一步完成嗎(比如
${FILE/.\(*\)/_sometext.\1}
$$ that doesn’t work $$)? 順便說一句,我需要在沒有
sed
/awk
/ 等的純 shell 中執行此操作。我的外殼是ksh
,但如果有辦法用 bashisms 來做,我也想知道。
Bash Parameter Expansion表示變數(
FILE
在您的範例中)必須是參數名稱。所以他們不築巢。並且最後一部分${param/pattern/replacement}
必須是字元串。所以不支持反向引用。我唯一的建議是使用
${EXT:+.$EXT}
如果文件沒有副檔名,以避免添加尾隨點。
更新
顯然ksh93支持反向引用。
所以你可以使用類似的東西
FILE="${FILE/@(.*)/_something\1}"
在這種特殊情況下,我認為
FILE=${FILE%.*}_sometext.${FILE##*.}
可以完成這項工作。