Има ли някакъв начин в 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
?
Благодаря ти
Всичко това може да се направи с Parameter Expansion. Моля, прочетете за това в страницата за ръководство на 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
Използване на функцията за регулярен израз на 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"
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 заедно в изхода.
Можете да токенизирате низа първо за -
и след това за .
. Има различни теми на SO за това как да направите това:
За да трансформирате 20120514104538
в 2012-05-14 10:45:38
:
Тъй като знаем, че първите 4 знака са година, следващите 2 са месеци и така нататък, първо ще трябва да разделите този токен на поднизове и след това да го комбинирате отново в единичен низ. Можете да започнете със следния отговор:
20120514104538
в 2012-05-14 10:45:38
- person pufos; 16.05.2012
bash
? Има цял раздел за разширяване на променливи, който трябва да ви даде някои идеи. - person larsks   schedule 16.05.2012