如何在VIM中使用单个命令从A转换为B

时间:2017-09-19 07:37:31

标签: vim

我想来自:

0010|C|||N55555555|E0222222220010

以下内容:

0010|C|||N55555555|E022222222|1.0

最后四位数字代表一位小数位数,例如它可能是:

0010|C|||N55514200|E0222222220300

我希望将命令转换为:

0010|C|||N55555555|E022222222|30.0

我希望输入一个命令来批量转换这些字符串。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您可以使用sub-replace-expression(请参阅:help sub-replace-\=):

:%s#\d\{4}$#\=printf('|%.1f', str2nr(submatch(0)) / 10.0)#

那是:

  • :%s#:为文件中的每一行执行此替换(使用#作为分隔符,因为我需要在/部分中使用\=
  • \d\{4}$:匹配该行的最后四位数字
  • \=:解释以下内容:

    • printf('|%.1f:打印|后跟1精度浮点数(第二个参数)
    • str2nr(submatch(0)):将匹配的4位数组转换为十进制数(删除尾随0以避免将0XYZ读为八进制值)
    • / 10.0:将值除以10

这转换

0010|C|||N55555555|E0222222220010
0010|C|||N55514200|E0222222220300
0010|C|||N55514200|E0222222220301
0010|C|||N55514200|E0222222229301

0010|C|||N55555555|E022222222|1.0
0010|C|||N55514200|E022222222|30.0
0010|C|||N55514200|E022222222|30.1
0010|C|||N55514200|E022222222|930.1