我有一份文件,内容如下:
$ cat file.txt
on that date April 02, 2020 end of line
March 5, 2021 helloooo world
J 14, 2022
error 3, bye我想将日期格式从“月日,年”更改为“日月年”。月份总是以大写字母开头,日期是一两位数,年份是四位数。
期望产出:
on that date 02 April 2020 end of line
5 March 2021 helloooo world
14 J 2022
error 3, bye我试了下,可以得到的一天和一年,但不能得到的月份
sed -r 's/([0-9]*[0-9]), ([0-9]{4})//g'我如何在Linux系统上使用sed来完成这个任务?
发布于 2020-11-26 17:58:55
这里有一种方法,假设您的数据如您所示,并且您没有任何不应该被视为日期的Foo 12, 0000 ):
$ 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日?如果你真的想匹配这样的东西,你可以试试:
$ 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最后,您还可以通过只查找作为一个月的第一封信可以找到的大写字母来使其更加具体:
sed -E 's/([JFMASOND][a-z]*) ([0-9]{1,2}), ([0-9]{4})\b/\2 \1 \3/g' filehttps://unix.stackexchange.com/questions/621678
复制相似问题