使用正则表达式重复进行Bash字符串替换

时间:2013-02-16 16:39:19

标签: regex string bash replace repeat

我有一个文件:filename_20130214_suffix.csv 我想用bash替换yyyymmdd部分。以下是我打算做的事情:

file=`ls -t /path/filename_* | head -1`
file2=${file/20130214/20130215}
#this will not work
#file2=${file/[0-9]{8}/20130215/}

2 个答案:

答案 0 :(得分:5)

问题是参数扩展不使用正则表达式,而是使用模式或整数(比较正则表达式“filename _。 .csv”和glob“filename _ .csv”之间的差异)。 Globs无法匹配固定数量的特定字符串。

但是,您可以在bash中启用扩展模式,该模式应该足够接近您想要的模式。

shopt -s extglob    # Turn on extended pattern support
file2=${file/+([0-9])/20130215}

你不能完全匹配8个挖掘,但是+(...)可以匹配括号内的一个或多个模式,这应该足以满足你的用例。

由于在这种情况下你要做的就是替换_个字符之间的所有内容,你也可以简单地使用

file2=${file/_*_/_20130215_}

答案 1 :(得分:1)

[[ $file =~ ^([^_]+_)[0-9]{8}(_.*) ]] && file2="${BASH_REMATCH[1]}20130215${BASH_REMATCH[2]}"