是否有在bash任何方式來解析這個文件名:慶典解析文件名
$file = dos1-20120514104538.csv.3310686
到像$date = 2012-05-14 10:45:38
和$id = 3310686
變量?
謝謝
是否有在bash任何方式來解析這個文件名:慶典解析文件名
$file = dos1-20120514104538.csv.3310686
到像$date = 2012-05-14 10:45:38
和$id = 3310686
變量?
謝謝
所有這一切都可以用參數擴展來完成。請在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
你是天才 – pufos
你可以先標記化字符串-
,然後.
。有對SO不同的線程上如何做到這一點:
要變換20120514104538
到2012-05-14 10:45:38
:
因爲我們知道,前4個字符是年,下2是幾個月等等,您首先需要將此令牌分解成子字符串,然後重新組合爲單個字符串。你可以用下面的回答開始:
現在可以做我將'20120514104538'變成'2012-05-14 10:45:38' – pufos
提取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一起輸出。
@VictorYarema:請不要把你最喜歡的提示放在命令前面。它使複製/粘貼更加困難,而且它們不是代碼的一部分。 –
同意。對不起。我在其他一些問題和答案中做了這樣的事情,以便更容易地剔除命令和輸出。後來我注意到你剛纔指出的問題。之後,我發現其他一些用戶只寫輸出註釋。後一種方法使它更好 - 您可以複製具有註釋輸出的命令並安全地運行它。我只是沒有時間去改變_style_。 –
如果我在每個輸出行的開頭添加散列符號,您是否會接受? –
使用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"
超酷也... ..非常感謝 – pufos
我不知道該怎麼做。我要問,如果有人這樣做,因爲我不知道從哪裏開始... – pufos
有你閱讀'bash'手冊頁?有一個關於變量擴展的整節應該給你一些想法。 – larsks
可能重複的[你如何在bash中解析文件名?](http://stackoverflow.com/questions/49403/how-do-you-parse-a-filename-in-bash) – Romain