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

发布于 2024-10-11 21:34:02 字数 405 浏览 6 评论 0原文

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

如何转换这些日期,使其采用以下形式:“date=YYYY-MM- DD”?

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

谢谢。

附录:

  • 月份名称是完整的英文月份名称,例如一月、二月等。
  • 我只想转换 ref 标签内的日期,即它们将被 内的其他文本包围;'
  • 我对任何语言的脚本都持开放态度。我做了一些 bash、javascript 和Python。但我认为 awk、sed、perl 等也可以。对代码的解释将不胜感激。

I have a text file with dates in the form: "date=month_name DD, YYYY" and "date=(month_name DD, YYYY)"

How can I convert these dates so they are in the form: "date=YYYY-MM-DD"?

I also have some dates preceded by the field name "accessdate=" or no field name, that I would like to convert.

Thanks.

ADDENDUM:

  • The month names are are the full English month names e.g. January, February, etc.
  • I would only like to convert the dates inside ref tags i.e. they would be surrounded by other text inside <ref></ref>'
  • I'm open to any language for the scripting. I've done a little bash, javascript & python. But I think awk, sed, perl, etc. would be also fine. Explanations of the code would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

后来的我们 2024-10-18 21:34:02

取决于您使用的工具。

例如使用 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

或者你可以用纯 awk 编写它,通过解析 $0.

Depends on the tool you use.

E.g. with awk & sed you can do something like this:

 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

Then you can do an

sed -i.ORIG -f tmp.sed INPUT_FILE

Or you can write it in pure awk, by parsing $0.

野却迷人 2024-10-18 21:34:02

您可以从

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 不足以使用 标记。例如Python,

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

You can begin with

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

To handle "date=(month_name DD, YYYY)" you can also add sed 's/date=(\([^(]*\))/date=\1/' to the pipe and so on.

Concerning your addendum. sed would not be enough to work with <ref></ref> tag if it spans more then one line. So you have to use something more powerful. E.g. Python.

re.search() can be used to find <ref> and the matching </ref>. Then re.match() can be used to transform what's inside using the regexps similar to those used in sed. This algorithm have to be enclosed in a while loop to traverse all the document.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文