次のファイルがあります:filename_20130214_suffix.csvbashのyyyymmdd部分を置き換えたいです。これが私がやろうとしていることです:
file=`ls -t /path/filename_* | head -1`
file2=${file/20130214/20130215}
#this will not work
#file2=${file/[0-9]{8}/20130215/}
問題は、パラメーター展開が正規表現ではなく、パターンまたはグロブを使用することです (正規表現 "filename_. .csv" とグロブ "filename_ .csv"の違いを比較してください)。グロブは、特定の文字列の固定数と一致することはできません。
ただし、 で拡張パターンを有効にすることができますbash
。これは、必要なものに十分近いはずです。
shopt -s extglob # Turn on extended pattern support
file2=${file/+([0-9])/20130215}
正確に 8 桁に一致させることはできませんが、+(...)
では括弧内の 1 つ以上のパターンに一致させることができます。これはユース ケースには十分なはずです。
_
この場合にやりたいことは、文字間のすべてを置き換えることだけなので、単純に使用することもできます
file2=${file/_*_/_20130215_}
[[ $file =~ ^([^_]+_)[0-9]{8}(_.*) ]] && file2="${BASH_REMATCH[1]}20130215${BASH_REMATCH[2]}"