在shell上,我可以得到以下替换:
echo '10**PM_dw2(np.log10(k_ref))' | sed 's/10\*\*PM_dw2(np.log10(\(.*\))/PM_dw2(\1/g'
结果:PM_dw2(k_ref)
但是进入Vim编辑器,我不能做同样的事情。示例:
用10**PM_NW_dw2(np.log10(k_ref))
替换的文本:
return ( P_obs_cross(k_ref, mu_ref,z,10**PM_dw2(np.log10(k_ref)),10**PM_NW_dw2(np.log10(k_ref)), bias_s8, gf_s8, er_FH, er_FH_ref, er_FDA, er_FDA_ref, ir, jc, lc, iPop) - 8*P_obs_cross(k_ref,mu_ref,z,10**PM_dw(np.log10(k_ref)),10**PM_NW_dw(np.log10(k_ref)), bias_s8, gf_s8, er_FH, er_FH_ref, er_FDA, er_FDA_ref, ir, jc, lc, iPop) + 8*P_obs_cros s(k_ref,mu_ref,z,10**PM_up(np.log10(k_ref)),10**PM_NW_up(np.log10(k_ref)), bias_s8, gf_s8, er_FH, er_FH_ref, er_FDA, er_FDA_ref, ir, jc, lc, iPop) - P_obs_cross(k_ref,mu_ref, z,10**PM_up2(np.log10(k_ref)), 10**PM_NW_up2(np.log10(k_ref)), bias_s8, gf_s8, er_FH, er_FH_ref, er_FDA, er_FDA_ref, ir, jc, lc, iPop) ) / (12*omega_b_fid*eps_wb)
6
如果我在vim下做:%s/10\*\*PM_dw2(np.log10(\(.*\))/PM_dw2(\1/g
然后,我得到了:
return ( P_obs_cross(k_ref, mu_ref,z,PM_dw2(k_ref)),10**PM_NW_dw2(np.log10(k_ref)), bias_s8, gf_s8, er_FH, er_FH_ref, er_FDA, er_FDA_ref, ir, jc, lc, iPop) - 8*P_obs_cros s(k_ref,mu_ref,z,10**PM_dw(np.log10(k_ref)),10**PM_NW_dw(np.log10(k_ref)), bias_s8, gf_s8, er_FH, er_FH_ref, er_FDA, er_FDA_ref, ir, jc, lc, iPop) + 8*P_obs_cross(k_ref,mu_re f,z,10**PM_up(np.log10(k_ref)),10**PM_NW_up(np.log10(k_ref)), bias_s8, gf_s8, er_FH, er_FH_ref, er_FDA, er_FDA_ref, ir, jc, lc, iPop) - P_obs_cross(k_ref,mu_ref,z,10**PM_up2( np.log10(k_ref)), 10**PM_NW_up2(np.log10(k_ref)), bias_s8, gf_s8, er_FH, er_FH_ref, er_FDA, er_FDA_ref, ir, jc, lc, iPop) ) / (12*omega_b_fid*eps_wb
正如您在行首看到的那样,我有:PM_dw2(k_ref))
,而我期望PM_dw2(k_ref)
(在右边没有第二个括号)。
我做错了什么?
致谢
答案 0 :(得分:1)
您的sed
输入和Vim中的输入之间的区别在于,后者在行内有多个(...)
部分。
(\(.*\))
部分是贪婪匹配项(由于*
);也就是说,它会尝试匹配尽可能多的字符(在一行中,.
仅匹配除换行符以外的其他字符)。
因此,您的sed
替换遭受相同的问题,由于输入不同,您只是没有注意到它。
存在*
的非贪婪变体(请参见:help pattern-multi-items
);按照Vim的语法,它是\{-}
;许多其他正则表达式方言(例如在Perl中)则使用*?
。如果使用它,则匹配的字符越少越好,因此它将在下一个)
处停止,而不是匹配包含的)
的数目,从而到达该行的最后一个字符:>
%s/10\*\*PM_dw2(np.log10(\(.\{-}\))/PM_dw2(\1/g
sed
的正则表达式只有贪婪的匹配;解决该问题的一种方法(在这种情况下)是将.
原子修改为一个不包含)
字符的 character class :{{1 }}。