我有一个文件: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/}
最佳答案
问题是参数扩展不是使用正则表达式,而是模式或globs(比较正则表达式“filename_..csv”和glob“filename_.csv”的区别)。 Glob 无法匹配固定数量的特定字符串。
但是,您可以在 bash
中启用扩展模式,这应该与您想要的足够接近。
shopt -s extglob # Turn on extended pattern support
file2=${file/+([0-9])/20130215}
您不能恰好匹配 8 个数字,但是 +(...)
可以让您匹配括号内的一个或多个模式,这应该足以满足您的用例。
因为在这种情况下你想要做的就是替换 _
字符之间的所有内容,你也可以简单地使用
file2=${file/_*_/_20130215_}
关于regex - 用正则表达式重复替换 Bash 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14912561/