このファイル名を解析する bash の方法はありますか :
$file = dos1-20120514104538.csv.3310686
$date = 2012-05-14 10:45:38
や$id = 3310686
?などの変数に変換します。
ありがとうございました
これらはすべて、パラメーター拡張で実行できます。これについては、bash のマンページを参照してください。
$ file='dos1-20120514104538.csv.3310686'
$ date="${file#*-}" # Use Parameter Expansion to strip off the part before '-'
$ date="${date%%.*}" # Use PE again to strip after the first '.'
$ id="${file##*.}" # Use PE to get the id as the part after the last '.'
$ echo "$date"
20120514104538
$ echo "$id"
3310686
PE を結合して、日付を新しい形式に戻します。GNU date を使用して日付を解析することもできますが、それでも解析できるように日付を並べ替える必要があります。現在の形式では、これが私がアプローチする方法です。
$ date="${date:0:4}-${date:4:2}-${date:6:2} ${date:8:2}:${date:10:2}:${date:12:2}"
$ echo "$date"
2012-05-14 10:45:38
抽出 ID:
f='dos1-20120514104538.csv.3310686'
echo ${f/*./}
# 3310686
id=${f/*./}
プレフィックスを削除し、コアの日付番号を抽出します。
noprefix=${f/*-/}
echo ${noprefix/.csv*/}
# 20120514104538
ds=${noprefix/.csv*/}
このように日付をフォーマットします(部分的にのみ行われます:)
echo $ds | sed -r 's/(.{4})(.{2})(.{2})/\1.\2.\3/'
または、初期変数を配列に分割することもできます。
echo $f
# dos1-20120514104538.csv.3310686
交換後・ このような:
echo ${f//[-.]/ }
# dos1 20120514104538 csv 3310686
ar=(${f//[-.]/ })
echo ${ar[1]}
# 20120514104538
echo ${ar[3]}
# 3310686
同様に、配列を介して日付変換を行うことができます。
dp=($(echo 20120514104538 | sed -r 's/(.{2})/ \1/g'))
echo ${dp[0]}${dp[1]}-${dp[2]}-${dp[3]} ${dp[4]}:${dp[5]}:${dp[6]}
すべてを 2 文字のグループに分割します。
echo ${dp[@]}
# 20 12 05 14 10 45 38
出力で 2012 をマージします。
Bash の正規表現機能を使用する:
file='dos1-20120514104538.csv.3310686'
pattern='^[^-]+-([[:digit:]]{4})'
for i in {1..5}
do
pattern+='([[:digit:]]{2})'
done
pattern+='\.[^.]+\.([[:digit:]]+)$'
[[ $file =~ $pattern ]]
read -r _ Y m d H M S id <<< "${BASH_REMATCH[@]}"
date="$Y-$m-$d $H:$M:$S"
echo "$date"
echo "$id"
最初に の文字列をトークン化し-
、次にの文字列をトークン化でき.
ます。これを行う方法については、SO にさまざまなスレッドがあります。
に変換20120514104538
するには2012-05-14 10:45:38
:
最初の 4 文字が年、次の 2 文字が月などであることがわかっているため、まずこのトークンを部分文字列に分割してから、1 つの文字列に再結合する必要があります。次の回答から始めることができます。