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

时间:2011-01-14 13:42:13

标签: regex scripting date html-parsing text-parsing

我有一个文本文件,其格式为日期:“date = month_name DD,YYYY”和“date =(month_name DD,YYYY)”

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

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

感谢。

附录:

  • 月份名称是完整的英文月份名称,例如一月,二月等
  • 我只想转换ref标签内的日期,即它们会被<ref></ref>'
  • 内的其他文字包围
  • 我对脚本的任何语言都持开放态度。我做了一个小小的bash,javascript&amp;蟒蛇。但我认为awk,sed,perl等也没关系。对代码的解释将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以从

开始
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/'

要处理“date =(month_name DD,YYYY)”,您还可以将sed 's/date=(\([^(]*\))/date=\1/'添加到管道中,依此类推。

关于你的附录。如果它超过一行,则sed不足以使用<ref></ref>标记。所以你必须使用更强大的东西。例如。蟒。

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

答案 1 :(得分:0)

取决于您使用的工具。

E.g。与awk&amp;你可以做这样的事情:

 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

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