首页 > 解决方案 > 在 Bash 中将 vim 替换为 sed / awk

问题描述

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

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

如何转换它以便我可以从命令行/ with 调用它sed

谢谢!

标签: regexbashvimsed

解决方案


您可以使用

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 位数字。

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

请参阅在线 sed 演示

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

推荐阅读