bash参数扩展搜索和替换捕获组

时间:2014-06-25 20:24:04

标签: bash zsh

当使用bash风格的search-and-replace parameter expansion时,有没有办法在模式中引用捕获的子串?

例如,我想在以“(某些数字)。mp3”结尾的文件名中插入前导0。这些文件的名称中还有其他的parens,所以我需要找到最接近末尾的紧密的paren:

${x/\(([[:digit:]]\).mp3)/\(0}

这不太有用,b / c它不会重新取代字符串的前一个结尾。

bash或zsh中有没有办法引用捕获的字符串? $BASH_REMATCH似乎不起作用。

2 个答案:

答案 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}"

的文件名即可