我有一个文本文件,其格式为日期:“date = month_name DD,YYYY”和“date =(month_name DD,YYYY)”
如何将这些日期转换为以下形式:“date = YYYY-MM-DD”?
我还有一些日期前面有字段名称“accessdate =”或没有字段名称,我想转换。
感谢。
附录:
<ref></ref>'
答案 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中编写它。