在Bash中将vim replace转换为sed / awk

时间:2019-02-26 18:08:53

标签: regex bash vim sed

我想在数据末尾的每个负值前添加一个;,如下所示:

29.01.2019;29.01.2019;KIND;NAME;ITEM;ITEMNUMBER;ITEMORDER;;;;;;;;;;20,00;VAL
29.01.2019;29.01.2019;KIND;NAME;ITEM;ITEMNUMBER;ITEMORDER;012345678;012345678901;FW02ZZZ46847351235;;;;;;;-1,13;;VAL

我在vim中的审判:

:%s/-\d\{0,5}\,\d\{0,2}/;&\1/g

不幸的是,我不能用sed来称呼它:

sed -E 's/-\d\{0,5}\,\d\{0,2}/;&\1/g'

我收到错误消息:

sed: 1: "s/-\d\{0,5}\,\d\{0,2}/; ...": \1 not defined in the RE

如何进行转换,以便可以从命令行/使用sed来调用它?

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以使用

sed -E 's/-\d{0,5}(,\d{1,2})?/;&/g'

详细信息

  • --连字符
  • \d{0,5}-0到5位数字 -(,\d{1,2})?-匹配1个或0个匹配项的可选捕获组
    • ,-逗号
    • \d{1,2}-1或2位数字。

替换模式中的&代表整个匹配值。

请参见online sed demo

s="29.01.2019;29.01.2019;KIND;NAME;ITEM;ITEMNUMBER;ITEMORDER;;;;;;;;;;20,00;VAL
29.01.2019;29.01.2019;KIND;NAME;ITEM;ITEMNUMBER;ITEMORDER;012345678;012345678901;FW02ZZZ46847351235;;;;;;;-1,13;;VAL"
sed -E 's/-\d{0,5}(,\d{1,2})?/;&/g' <<< "$s"

输出:

29.01.2019;29.01.2019;KIND;NAME;ITEM;ITEMNUMBER;ITEMORDER;;;;;;;;;;20,00;VAL
29.01.2019;29.01.2019;KIND;NAME;ITEM;ITEMNUMBER;ITEMORDER;012345678;012345678901;FW02ZZZ46847351235;;;;;;;;-1,13;;VAL