Correspondencia de sellos de hora de git log con bash regex

Estoy escribiendo un script para convertir mi logging de git en el formatting de calendar de Google. Pero cuando reviso el file calendar.txt, solo tiene la línea de encabezado inicial.

Usé esta expresión regular manualmente en sublime y funcionó perfectamente. Entonces debe haber algo mal con mi syntax 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 

\d es PCRE, no POSIX ERE (que es la syntax de expresiones regulares utilizada por bash). Use [[:digit:]] para unir un dígito en una forma compatible con ERE.

O simplemente podría hacer el análisis de la date y formatear de una manera completamente diferente. Personalmente, si tuvieras date de GNU, usaría eso.

 { 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 

También notará que esta versión no requiere files temporales y abre calendar.txt para que se muestre solo una vez, en lugar de volver a abrirla cada vez que quiera hacer una escritura de una sola línea.