2013-09-27 4 views
0

J'écris un script pour convertir mon journal git en format google calendar. Mais quand je vérifie le fichier calendar.txt, il n'a que la ligne d'en-tête initiale.Horodatage de git log avec bash regex

J'ai utilisé cette regex manuellement en sublime et cela a fonctionné parfaitement. Donc, il doit y avoir quelque chose qui ne va pas avec ma syntaxe bash.

#! /bin/bash 
# add git log 
git log --date=iso --pretty=format:"%ad%x09%s" > calendartmp.txt 

# add header line to beginning of file 
echo "Start Date,Start Time,Subject" > calendar.txt 

#parse line by line into correct format 
# "\d\d(\d\d)-(\d\d)-(\d\d) ([\d+\:]+) .*\t(.*)" -> "$2/$3/$1,$4,$5" 

while read p; do 
    [[ $p =~ \d\d(\d\d)\-(\d\d)\-(\d\d)\ (\d\d\:\d\d\:\d\d).*\t(.*) ]] && echo "${BASH_REMATCH[2]}/${BASH_REMATCH[3]}/${BASH_REMATCH[1]},${BASH_REMATCH[4]},${BASH_REMATCH[5]}" >> calendar.txt 
done < calendartmp.txt 

#delete temp file 
rm calendartmp.txt 

Répondre

2

\d est PCRE, pas ERE POSIX (qui est la syntaxe regex utilisée par bash). Utilisez [[:digit:]] pour faire correspondre un chiffre d'une manière compatible ERE.

Ou vous pouvez simplement faire l'analyse de la date et le reformater d'une manière entièrement différente. Personnellement, si vous aviez la date GNU, je l'utiliserais.

{ 
    echo "Start Date,Start Time,Subject" 
    while IFS=$'\t' read -r date data; do 
    printf '%s,%s' "$(date --date="$date" +%m/%d/%Y,%H:%M:%S)" "$data" 
    done 
} < <(git log --date=iso --pretty='%ad%x09%s') \ 
    >calendar.txt 

Vous remarquerez également que cette version nécessite aucun fichier temporaire et ouvre calendar.txt pour la sortie une seule fois, plutôt que de rouvrir chaque fois que vous voulez faire une écriture unique en ligne.