2016-06-14 29 views
2

我需要更换以下行:与数学表达式VIM替代

[rescap] l=1.2u w=1.5u 

通过

[rescap] l=1.2u w=1.5u r=0.8k 

[R 0.8K的值是L/W

我想在vim(已在perl中完成但想实现使用vim)

:s/l=\\(.\*\\)u w=\\(.\*\\)u/l=\1u w=\2u r=\1*\2k/ 

但它不评估表达和打印:

[阻容组件] L = 1.2uw = 1.5ur = 1.2 * 1.5K

如果我尝试\ =其评估表达它假定L和W作为变量并抛出错误。

:s/l=\\(.\*\\)u w=\\(.\*\\)u/\=l=\1u w=\2u r=\1*\2/  

我必须通过许多文件使用vim -s脚本文件运行上述表达式。 只需要弄清楚上面的替换语句。

回答

2

您正在寻找:

%s#\vl\=([0-9.]+)u\s+w\=([0-9.]+)u\zs.*#\=' r='.string(eval(submatch(1))/eval(submatch(2))).'u' 

最重要的事情是:

  • \=告诉你会被插入表情 - 第三届之一(前两个是诱导怪癖通过我的使用非常魔法与\v)正则表达式 - >:h :s\=
  • submatch()访问\1\2
  • eval()到子匹配转换成浮点数,并string()将其转换回
  • 也注意到,为了\=后插入文本,你需要明确建立一个字符串

以后,我使用:

  • \v简化的正则表达式,
  • :s#代替:s/简化替代表达,因为我需要/来计算划分,
  • \zs简化替换表达。

最后需要知道的资料片,以达到与正则表达式/模式的文档,在前面加上你是一个斜线寻找什么 - >:h /\v:h /\zs

+0

感谢吕克。正是我想要的方式。非常感谢。 – user2508758

+0

@ user2508758如果能真正解决您的问题,请接受答案。这就是你在SO说“谢谢”的方式 – Kent