当使用bash风格的search-and-replace parameter expansion时,有没有办法在模式中引用捕获的子串?
例如,我想在以“(某些数字)。mp3”结尾的文件名中插入前导0
。这些文件的名称中还有其他的parens,所以我需要找到最接近末尾的紧密的paren:
${x/\(([[:digit:]]\).mp3)/\(0}
这不太有用,b / c它不会重新取代字符串的前一个结尾。
bash或zsh中有没有办法引用捕获的字符串? $BASH_REMATCH
似乎不起作用。
答案 0 :(得分:1)
您可以使用sed
sed 's/\(.*(\)\([0-9][0-9]*).mp3\)/\10\2/'
我认为这会获得所需的功能......我确信有一种更为流畅的方式,我只是开始自己学习sed
。
答案 1 :(得分:0)
执行此操作的一种方法是首先从文件名中删除扩展名,只留下name
中的基本文件名。接下来使用name - 1
的长度作为字符串索引来返回name
中的最后一个字符。最后,检查lastchar )
。
name="${filename%.*}" # remove extension from filename
if [[ ${name:((${#name}-1))} == ")" ]]; then ## just isolates last char and test again ")"
# modify as needed to insert '0'
newfilename="0${filename}" # to append the '0' to beginning of filename
fi
注意:不需要仅用于说明的新变量nefilename
。将0
添加到带有filename="0${filename}"