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

如何在VIM中使用单个命令从A转换为B,vim,Vim,我想从以下地址获得: 0010|C|||N55555555|E0222222220010 对下列事项: 0010|C|||N55555555|E022222222|1.0 最后四位数字表示小数点后一位的数字,例如: 0010|C|||N55514200|E0222222220300 我希望命令将其转换为: 0010|C|||N55555555|E022222222|30.0 我想输入一个命令,它将大量转换这些字符串。任何帮助都将不胜感激 您可以使用子替换表达式(请参见:help sub

我想从以下地址获得:

0010|C|||N55555555|E0222222220010
对下列事项:

0010|C|||N55555555|E022222222|1.0
最后四位数字表示小数点后一位的数字,例如:

0010|C|||N55514200|E0222222220300
我希望命令将其转换为:

0010|C|||N55555555|E022222222|30.0

我想输入一个命令,它将大量转换这些字符串。任何帮助都将不胜感激

您可以使用
子替换表达式(请参见
:help sub replace-\=
):

即:

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

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

这改变了

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


嗨,这太神奇了!但是当我把它映射到一个按钮时,VIM开始出现以下错误942:不是编辑器命令%.1f',str2nr(submatch(0))/10.0)#Read
:help map bar
。经过仔细观察,我发现“|”是导致问题的原因,因为它被用作“管道字符”来破译代码。不知道从那里去哪里,但我正在取得一点进展:)到目前为止你试过什么吗?通过展示您的尝试和描述您遇到困难的部分,我们可以更好地了解您的熟练程度,并给出更准确的答案。目前看来,你只是发布了一个需求,希望有人为你编写代码。我已经尝试映射Marth提供的代码:映射:%s#\d\{4}$\\=printf('.\%.1f',str2nr(submatch(0))/10.0),在运行VIM后,我得到以下错误:在处理C:\Program Files(x86)时检测到错误\Vim_vimrc:第20行:E492:不是编辑器命令:%.1f',str2nr(submatch(0))/10.0)#在Vim中测试按钮后,我可以看到命令停在:%.1f',str2nr(submatch(0))/10.0)#知道为什么吗?不,我的意思是在询问并收到答案之前先尝试一下:-)我不是一个程序员,毫无头绪:(这不是一个很好的借口。1.如果您不熟悉Vim(及其导航和编辑命令),您应该花30分钟在它附带的
vimtutor
上(请参阅
:帮助vimtutor
)。然后,网上有一些很好的资源、备忘单和vi/Vim教程。有一些简短的娱乐性插曲,超出了基础。2.学习如何查找命令和导航内置的
:help
;它很全面,提供了许多提示。你不会像其他编辑器那样快速地学习Vim,但是如果你从麻省理工学院到持续学习,一切都会好起来的。
0010|C|||N55555555|E022222222|1.0
0010|C|||N55514200|E022222222|30.0
0010|C|||N55514200|E022222222|30.1
0010|C|||N55514200|E022222222|930.1