6

このファイル名を解析する bash の方法はありますか :

$file = dos1-20120514104538.csv.3310686

$date = 2012-05-14 10:45:38$id = 3310686?などの変数に変換します。

ありがとうございました

4

4 に答える 4

16

これらはすべて、パラメーター拡張で実行できます。これについては、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
于 2012-05-16T12:10:55.000 に答える
3

抽出 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 をマージします。

于 2012-05-16T12:12:25.503 に答える
3

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"
于 2012-05-17T04:33:24.787 に答える
1

最初に の文字列をトークン化し-、次にの文字列をトークン化でき.ます。これを行う方法については、SO にさまざまなスレッドがあります。

  1. Bashの区切り文字で文字列を分割するにはどうすればよいですか?
  2. Bash:文字列変数をトークン化する方法は?

に変換20120514104538するには2012-05-14 10:45:38:

最初の 4 文字が年、次の 2 文字が月などであることがわかっているため、まずこのトークンを部分文字列に分割してから、1 つの文字列に再結合する必要があります。次の回答から始めることができます。

  1. https://stackoverflow.com/a/428580/365188
于 2012-05-16T12:02:48.477 に答える