输入:
工作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字符(或我们用作分隔符的任何其他字符)。pattern
replacement
's@pattern@replacement@'
/
@
[0-9]\{4\}
匹配4位数字;再次{
并且}
必须逃脱,因为bash
必须逃脱。
([0-9]) 匹配任何一位数字并将其“保存”以供以后使用(到内存);然后,在替换中,我们可以使用括在括号(
和中的匹配子字符串)
(在本例中为单个数字)。同样,我们需要逃离他们,因为bash
。
\1
是第一个保存的子字符串(参见上一段);同样\2
是第二个并且\3
第三个。
因此: 匹配或格式\([0-9]\+\)\/\([0-9]\+\)\/\([0-9]\{4\}\)
的日期。dd/mm/yyyy
d/m/yyyy
\3\/\2\/\1
是一个替换,其中包含\3
(第三个子字符串,年份),\/
是一个斜杠,\2
(第二个子字符串,月份),再次\/
(斜杠),最后是\1
(第一个子字符串,月份中的日期)。