使用 sed 将文件中的日期格式从月日、年更改为日月年

使用 sed 将文件中的日期格式从月日、年更改为日月年

我有一个包含以下内容的文件:

$ cat file.txt
on that date April 02, 2020 end of line
March 5, 2021 helloooo world
J 14, 2022
error 3, bye

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

期望的输出:

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 执行此操作?

答案1

这是一种方法,假设您的数据如您所显示的那样,并且您没有类似的内容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 20203 月 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' file

相关内容