【问题标题】:script to convert date (month_name DD, YYYY) to (YYYY-MM-DD)将日期 (month_name DD, YYYY) 转换为 (YYYY-MM-DD) 的脚本
【发布时间】:2011-06-09 03:54:30
【问题描述】:

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

如何转换这些日期,使其格式为:“date=YYYY-MM-DD”?

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

谢谢。

附录:

  • 月份名称是完整的英文月份名称,例如一月、二月等。
  • 我只想转换 ref 标签内的日期,即它们将被 <ref></ref>' 内的其他文本包围
  • 我愿意接受任何语言编写脚本。我做了一点 bash、javascript 和 python。但我认为 awk、sed、perl 等也可以。对代码的解释将不胜感激。

【问题讨论】:

  • 您对使用的语言有什么偏好吗?这将是 PHP、shell 脚本、Python 还是其他?
  • 另外,月份名称是长还是短? (或两者的混合?)它们是英文的吗?
  • 请参阅附录以获取问题的答案。至于哪种语言,你可以选择你认为对新手最有效/最容易使用的语言。

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


【解决方案1】:

取决于您使用的工具。

例如使用 awk 和 sed 你可以这样做:

 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 编写它。

【讨论】:

    【解决方案2】:

    你可以开始

    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/' 添加到管道等。

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

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

    【讨论】:

    • 感谢您的提示。我将尝试使用 re.search 然后 re.match 建议的方法。
    • 请注意,在上面的代码中,我需要在解析月份名称时在每个-e前加上“| sed”,最后应该是\3-\1-\2/以 yyyy-mm-dd 格式获取它。
    • 其实我不需要放“| sed”,因为'\'后面有一个空格来将代码分成另一行,所以我出错了。
    猜你喜欢
    • 2014-02-05
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    相关资源
    最近更新 更多