regex101与SED

时间:2019-08-12 21:51:33

标签: bash sed

我在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

我做错了什么?感谢您的帮助。

2 个答案:

答案 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:]