0

我正在编写一个脚本来将我的 git 日志转换为谷歌日历格式。但是当我检查 calendar.txt 文件时,它只有初始标题行。

我在 sublime 中手动使用了这个正则表达式,它工作得很好。所以我的 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
4

1 回答 1

2

\d是 PCRE,而不是 POSIX ERE(这是 bash 使用的正则表达式语法)。用于[[:digit:]]以与 ERE 兼容的方式匹配数字。

或者您可以完全以不同的方式进行日期解析和重新格式化。就个人而言,如果你有 GNU date,我会使用它。

{
  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

您还会注意到此版本不需要临时文件,并且只打开一次 calendar.txt 进行输出,而不是每次您想要进行单行写入时都重新打开它。

于 2013-09-27T12:51:17.230 回答