我在Linux SED中相当陌生,我需要翻译例如。在字符串下面:
5069 ;08 Aug 00:00;0
到
5069 ;08 Aug 2019 00:00:00;0
使用SED。
我在regex101.com网页上测试了regrex,但在SED中似乎无法正常工作(我使用了-r,--regexp-extended选项)。
正则表达式:
(\s.*\d.*\s;)(\d\d)\s(Aug)\s(\d\d:\d\d)(;\d)
替换:
\1\2 \3 2019 \4:00\5
网页结果(确定)
5069 ;08 Aug 2019 00:00:00;0
但是在bash中是NOK。
echo " 5069 ;08 Aug 00:00;0" | sed -r 's/(\s.*\d.*\s;)(\d\d)\s(Aug)\s(\d\d:\d\d)(;\d)/\1\2 \3 2019 \4:00\5/g'
5069; 08 Aug 08:0; 0
我做错了什么?感谢您的帮助。
答案 0 :(得分:2)
awk
是您的朋友,您的翻译可以通过以下方式处理:
awk '{$3=$3" 2019"; $4="00:"$4}1'
使用/输出示例
$ echo "5069 ;08 Aug 00:00;0" | awk '{$3=$3" 2019"; $4="00:"$4}1'
5069 ;08 Aug 2019 00:00:00;0
说明
awk
允许您对输入的每一行中存在的字段进行操作(默认值:用空格分隔)。 awk
开始对1
处的字段进行计数。因此,要修改的字符串上方是{{1}上的 piped 到awk
,然后stdin
可以使用以下规则修改输入({{1 }}):
awk
-使用字符串串联将{...}
添加到第三字段; $3=$3" 2019"
-在第四个字段的开头加上" 2019"
;和$4="00:"$4
最后是规则的简称,用于打印记录。产生所需的字符串。
注意:您可以按照列出的顺序应用任意多的规则。
答案 1 :(得分:0)
我会尝试:
$ echo " 5069 ;08 Aug 00:00;0" | sed -r 's/;([0-9]{2} [A-Z][a-z]{2}) ([0-9]{2}:[0-9]{2});/;\1 2019 \2;/g'
5069 ;08 Aug 2019 00:00;0
how to match digits in regex回答了\d
不匹配的原因:
\d
和\w
在POSIX正则表达式中不起作用,尽管您可以使用[:digit:]