2013-02-16 89 views
1

我有一個文件:filename_20130214_suffix.csv 我想在bash中替換yyyymmdd部分。這是我打算做:Bash字符串替換正則表達式重複

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

回答

5

的問題是,參數擴展不使用正則表達式,但圖案或水珠(比較正則表達式的區別「 filename_ 的.csv」和水珠「 filename_ .csv「)。 Globs無法匹配固定數量的特定字符串。

但是,您可以在bash中啓用擴展模式,該模式應該足夠接近您想要的。

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

不能完全匹配8 digts,但+(...)讓你匹配一個或多個括號內的模式,這應該足以滿足您的使用情況。

因爲所有你想在這種情況下,做的是_字符之間代替一切,你也可以簡單地使用

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