2

次のファイルがあります: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/}
4

2 に答える 2

5

問題は、パラメーター展開が正規表現ではなく、パターンまたはグロブを使用することです (正規表現 "filename_. .csv" とグロブ "filename_ .csv"の違いを比較してください)。グロブは、特定の文字列の固定数と一致することはできません。

ただし、 で拡張パターンを有効にすることができますbash。これは、必要なものに十分近いはずです。

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

正確に 8 桁に一致させることはできませんが、+(...)では括弧内の 1 つ以上のパターンに一致させることができます。これはユース ケースには十分なはずです。

_この場合にやりたいことは、文字間のすべてを置き換えることだけなので、単純に使用することもできます

file2=${file/_*_/_20130215_}
于 2013-02-16T17:07:51.560 に答える
1
[[ $file =~ ^([^_]+_)[0-9]{8}(_.*) ]] && file2="${BASH_REMATCH[1]}20130215${BASH_REMATCH[2]}"
于 2013-02-17T12:05:09.687 に答える