我需要替换以下行:
[rescap] l=1.2u w=1.5u
Run Code Online (Sandbox Code Playgroud)
经过
[rescap] l=1.2u w=1.5u r=0.8k
Run Code Online (Sandbox Code Playgroud)
r 0.8k 的值是 l/w
我正在 vim 中尝试(已经在 perl 中完成,但想使用 vim 实现)
:s/l=\\(.\*\\)u w=\\(.\*\\)u/l=\1u w=\2u r=\1*\2k/
Run Code Online (Sandbox Code Playgroud)
但它不计算表达式并打印:
[重述] l=1.2uw=1.5ur=1.2*1.5k
如果我尝试 \= 计算表达式,它会假定 l 和 w 作为变量并抛出错误。
:s/l=\\(.\*\\)u w=\\(.\*\\)u/\=l=\1u w=\2u r=\1*\2/
Run Code Online (Sandbox Code Playgroud)
我必须使用 vim -s scriptfile 通过许多文件运行上述表达式。只需要弄清楚上面的替换语句。
您正在寻找:
%s#\vl\=([0-9.]+)u\s+w\=([0-9.]+)u\zs.*#\=' r='.string(eval(submatch(1))/eval(submatch(2))).'u'
Run Code Online (Sandbox Code Playgroud)
重要的是:
\=这告诉你将插入一个表达式——第三个(前两个是我使用非常神奇的正则表达式引起的怪癖\v)->:h :s\=submatch()访问\1和\2eval()将子匹配转换为浮点数,并将string()其转换回\=,您需要显式构建一个字符串然后,我用过:
\v 简化正则表达式, :s#而不是:s/简化替换表达式,因为我需要/计算除法,\zs以简化替换表达式。最后需要知道的一条信息,要访问与正则表达式/模式相关的文档,在您要查找的内容前面加上斜杠 -> :h /\v,:h /\zs