交换数字以重新格式化日期

交换数字以重新格式化日期

输入:

工作1 07/09/2018 22:40:57 01/20/2019 11:48:52
工作2 11/28/2018 19:23:49 01/20/2019 05:29:49

预期输出:

工作1 2018/09/07 22:40:57 2019/20/01 11:48:52
工作2 2018/28/11 19:23:49 2019/20/01 05:29:49

更改文本自日/月/年年/月/日,即替换文本

答案1

太长了;博士

$ echo -e "Job1 07/09/2018 22:40:57 01/20/2019 11:48:52\nJob2 11/28/2018 19:23:49 01/20/2019 05:29:49" | sed 's/\([0-9]\+\)\/\([0-9]\+\)\/\([0-9]\{4\}\)/\3\/\2\/\1/g' -
Job1 2018/09/07 22:40:57 2019/20/01 11:48:52
Job2 2018/28/11 19:23:49 2019/20/01 05:29:49

sed命令解释:

's/pattern/replacement/'这是基本语法

当我们g在末尾添加 a 时(例如's/pattern/replacement/g'),它将在一行上进行多次替换。

[0-9]匹配任意一位数字。

[0-9]*匹配零个或多个数字。

[0-9]\+匹配一个或多个数字(注意:反斜杠\是转义字符;在本例中,我们需要转义+,因为否则bash会解释它,而不是sed;另请注意,在其他情况/使用时,它不必转义)。

\/是斜杠/;再次它必须被转义,但现在因为sed,因为我们在和/之间用作分隔符;我们可以使用任何其他字符(例如,然后我们不需要替换斜杠,而是替换 at字符(或我们用作分隔符的任何其他字符)。patternreplacement's@pattern@replacement@'/@

[0-9]\{4\}匹配4位数字;再次{并且}必须逃脱,因为bash必须逃脱。

([0-9]) 匹配任何一位数字并将其“保存”以供以后使用(到内存);然后,在替换中,我们可以使用括在括号(和中的匹配子字符串)(在本例中为单个数字)。同样,我们需要逃离他们,因为bash

\1是第一个保存的子字符串(参见上一段);同样\2是第二个并且\3第三个。

因此: 匹配或格式\([0-9]\+\)\/\([0-9]\+\)\/\([0-9]\{4\}\)的日期。dd/mm/yyyyd/m/yyyy

\3\/\2\/\1是一个替换,其中包含\3(第三个子字符串,年份),\/是一个斜杠,\2(第二个子字符串,月份),再次\/(斜杠),最后是\1(第一个子字符串,月份中的日期)。

相关内容