首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed更改文件中的日期格式,从月到日,年复一年

使用sed更改文件中的日期格式,从月到日,年复一年
EN

Unix & Linux用户
提问于 2020-11-26 17:11:03
回答 1查看 785关注 0票数 1

我有一份文件,内容如下:

代码语言:javascript
复制
$ cat file.txt
on that date April 02, 2020 end of line
March 5, 2021 helloooo world
J 14, 2022
error 3, bye

我想将日期格式从“月日,年”更改为“日月年”。月份总是以大写字母开头,日期是一两位数,年份是四位数。

期望产出:

代码语言:javascript
复制
on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye

我试了下,可以得到的一天和一年,但不能得到的月份

代码语言:javascript
复制
sed -r 's/([0-9]*[0-9]), ([0-9]{4})//g'

我如何在Linux系统上使用sed来完成这个任务?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-11-26 17:58:55

这里有一种方法,假设您的数据如您所示,并且您没有任何不应该被视为日期的Foo 12, 0000 ):

代码语言:javascript
复制
$ sed -E 's/([A-Z][a-z]+) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
J 14, 2022
error 3, bye

我们查找大写字母,后面跟着一个或多个小写字母([A-Z][a-z]+),然后是一个空格和一个或两个数字([0-9]{1,2}),然后是逗号和空格,确切地说是4个数字,后面跟着一个单词边界(\b:一个单词到非单词转换;这将匹配一个空格,或行尾或任何其他不是单词字符的东西)。括号将相关组捕获到\1\2\3中,然后我们将它们用于替换。

注意,这不适用于J 14, 2022,因为这不是一个有效的日期。例如,M 14 2020是3月14日还是5月14日?如果你真的想匹配这样的东西,你可以试试:

代码语言:javascript
复制
$ sed -E 's/([A-Z][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye

最后,您还可以通过只查找作为一个月的第一封信可以找到的大写字母来使其更加具体:

代码语言:javascript
复制
sed -E 's/([JFMASOND][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' file
票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/621678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档