2016-06-14 30 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