脚本将日期(month_name DD,YYYY)转换为(YYYY-MM-DD)

脚本将日期(month_name DD,YYYY)转换为(YYYY-MM-DD)

问题描述:

我有一个文本文件,日期格式为:“date = month_name DD,YYYY”和“date =(month_name DD,YYYY) “脚本将日期(month_name DD,YYYY)转换为(YYYY-MM-DD)

如何将这些日期转换为以下格式:”date = YYYY-MM-DD“?

我也有一些日期前面的字段名称“accessdate =”或没有字段名称,我想转换。

感谢。

附录:

  • 月份名称是英文月份名称例如1月,2月等
  • 我只想转换ref标签内的日期,即它们将被其他文本包围<ref></ref>'
  • 我对任何脚本语言都是开放的。我做了一个小小的bash,javascript & python。但我认为awk,sed,perl等等也会很好。代码的解释将不胜感激。
+0

你有什么偏爱你使用的lanugage吗?这会变成PHP,shell脚本,Python还是其他的东西? – Spudley 2011-01-14 14:30:02

+0

也是,月份名称长或短? (或两者的混合?),他们是英语吗? – Spudley 2011-01-14 14:35:00

您可以

echo 'date=April 13, 1985' | sed -e 's/January/01/' ... \ 
     -e 's/April/04/' ... -e 's/December/12/' | \ 
    sed 's/\([0-9]*\)[^0-9]\([0-9]*\)[^0-9] \([0-9]*\)$/\1-\2-\3/' 

要处理 “的日期=(MONTH_NAME DD,YYYY)”,你还可以添加sed 's/date=(\([^(]*\))/date=\1/'到管等开始。

关于您的附录。如果跨越多于一行,sed将不足以与<ref></ref>标记一起使用。所以你必须使用更强大的东西。例如。蟒蛇。

re.search()可用于查找<ref>和匹配</ref>。然后使用re.match()可以使用类似于sed中使用的正则表达式来转换内部的内容。该算法必须包含在循环中遍历所有文档的while循环中。

取决于您使用的工具。

E.g.与sed的,你可以做这样的事情AWK &:

awk '{ 
     /date=(?Jan/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-01-\\2\\4"} 
     /date=(?Feb/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-02-\\2\\4"} 
     /date=(?Mar/ {print "s/\\(.\\+\\)date=(\\?month_name \\(\\d\\d\\), \\(\\d\\d\\d\\d\\))\\?\\(\.\\+\\)$/\\1date=\\3-03-\\2\\4"} 
     # ... 
}' INPUT_FILE > tmp.sed 

然后,你可以做一个

sed -i.ORIG -f tmp.sed INPUT_FILE 

或者你可以把它写在纯awk中,通过解析$ 0