sed-命令行和vim之间的区别

时间:2019-02-26 12:16:57

标签: vim sed

在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)(在右边没有第二个括号)。

我做错了什么?

致谢

1 个答案:

答案 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 }}。