Bash

變數中的純殼複數替換

  • January 11, 2017

有什麼方法可以一次替換多個模式的變數中的文本,甚至使用反向引用?

例如,我有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##*.}可以完成這項工作。

引用自:https://unix.stackexchange.com/questions/38390