使用SED或其他unix命令修复日期格式?

使用SED或其他unix命令修复日期格式?,unix,sed,Unix,Sed,我有一个日期格式的大文件,比如2014-3-16 基本正则表达式模式为[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}的年-月-日 某些条目的格式不正确:月/日/年小时:分钟:上午二点(或下午二点) [0-9]{1,2}/[0-9]{1,2}/[0-9]{4}[0-9]{1,2}:[0-9]{2}[A-Z]M的基本正则表达式模式 我尝试使用python和csv阅读器来修复这些日期,但csv阅读器引入了各种有趣的错误,比如在其他字段中更改引号,以及在每行末尾添加^M。因此,我正在尝试学

我有一个日期格式的大文件,比如2014-3-16

基本正则表达式模式为[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}的年-月-日

某些条目的格式不正确:月/日/年小时:分钟:上午二点(或下午二点)

[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}[0-9]{1,2}:[0-9]{2}[A-Z]M的基本正则表达式模式


我尝试使用python和csv阅读器来修复这些日期,但csv阅读器引入了各种有趣的错误,比如在其他字段中更改引号,以及在每行末尾添加^M。因此,我正在尝试学习如何使用SED,我认为这将有答案。有什么帮助吗?

这应该可以满足您的需要:

sed -i -e 's/\([0-9]\{1,2\}\)\/\([0-9]\{1,2\}\)\/\([0-9]\{2,4\}\)\([ :0-9]*[AP]\{1\}M\)/\3-\1-\2/g' file.txt
基本上有三种模式:

\(\[0-9]\{1,2\}\)\/
这意味着它将找到一个或两个[0-9],后跟一个/

然后最后一个

\([ :0-9]*[AP]\{1\}M\)
它查找前三个模式之后、AM或PM之前的空格、冒号和0-9。它将上面第三个模式之后的所有内容通过M合并为一个模式

最后一部分:

\3-\1-\2

这意味着它在s/…之间替换了所有内容。。。第一个/未转义,提到了第三个模式、第一个模式和第二个模式。为您提供年、月、日期格式。

如果您提供了。
^M
源于EOL(行尾)混乱,有关详细信息,请参阅。(我不是下级选民)27、8、2016猫这是假数据,拉大大大达2011秀2日,11/12/2014 8:00 PM,11/14/2014 3:54上午2910364德克萨斯大学,这是更多的伪造数据19.252452452,如果你在这里看到的话,有2个数据格式错误。请使用将此信息添加到问题中,因为您的sed版本可能与我使用的版本不同。您可以尝试执行以下操作:sed的…[插入替换]…g'file1.txt>file2.txt,看看这是否符合您的要求。如果您使用手册页sed,它也可能为您提供问题所在的线索。您可能需要在replacement命令中转义破折号,因此您可以执行\3\-\1\-\2或类似操作,而不是\3-\1\-\2。切换-i和-e的顺序修复了此问题!谢谢伟大的我更新了答案以反映对你有帮助的地方。第三个
\(\[0-9]\{1,2\}\/
不应该是
\(\[0-9]\{2,4\})\/
或者仅仅是
\(\[0-9]\{4\})\/
来处理4位数的年份吗?是的,很好。要么是这样,要么是(20[0-9]\{2\}/,如果它们都是为YYYY格式化的。