2012-05-16 130 views
2

是否有在bash任何方式來解析這個文件名:慶典解析文件名

$file = dos1-20120514104538.csv.3310686

到像$date = 2012-05-14 10:45:38$id = 3310686變量?

謝謝

+0

我不知道該怎麼做。我要問,如果有人這樣做,因爲我不知道從哪裏開始... – pufos

+1

有你閱讀'bash'手冊頁?有一個關於變量擴展的整節應該給你一些想法。 – larsks

+1

可能重複的[你如何在bash中解析文件名?](http://stackoverflow.com/questions/49403/how-do-you-parse-a-filename-in-bash) – Romain

回答

10

所有這一切都可以用參數擴展來完成。請在bash manpage中閱讀它。

$ 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: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 
+1

你是天才 – pufos

1

你可以先標記化字符串-,然後.。有對SO不同的線程上如何做到這一點:

  1. How do I split a string on a delimiter in Bash?
  2. Bash: How to tokenize a string variable?

要變換201205141045382012-05-14 10:45:38

因爲我們知道,前4個字符是年,下2是幾個月等等,您首先需要將此令牌分解成子字符串,然後重新組合爲單個字符串。你可以用下面的回答開始:

  1. https://stackoverflow.com/a/428580/365188
+0

現在可以做我將'20120514104538'變成'2012-05-14 10:45:38' – pufos

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一起輸出。

+0

@VictorYarema:請不要把你最喜歡的提示放在命令前面。它使複製/粘貼更加困難,而且它們不是代碼的一部分。 –

+0

同意。對不起。我在其他一些問題和答案中做了這樣的事情,以便更容易地剔除命令和輸出。後來我注意到你剛纔指出的問題。之後,我發現其他一些用戶只寫輸出註釋。後一種方法使它更好 - 您可以複製具有註釋輸出的命令並安全地運行它。我只是沒有時間去改變_style_。 –

+0

如果我在每個輸出行的開頭添加散列符號,您是否會接受? –

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" 
+0

超酷也... ..非常感謝 – pufos