sed - разница между командной строкой и vim - PullRequest
0 голосов
/ 26 февраля 2019

В оболочке я могу получить следующую замену:

echo '10**PM_dw2(np.log10(k_ref))' | sed 's/10\*\*PM_dw2(np.log10(\(.*\))/PM_dw2(\1/g'

Resutl: 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

Тогда яget:

   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 голосов
/ 26 февраля 2019

Разница между вашим sed входом и входом в Vim заключается в том, что последний имеет несколько (...) частей внутри линии.

(\(.*\)) часть - жадная совпадение (из-за *);это означает, что он пытается найти как можно больше символов (в пределах строки, поскольку . соответствует только символам, отличным от новой строки, заканчивающей строку).

Таким образом, ваша замена sed страдает отта же проблема, вы просто не заметили ее из-за различных входных данных.

Решение

Существует не жадный вариант * (см. :help pattern-multi-items);в синтаксисе Vim это \{-};многие другие диалекты регулярных выражений (например, в Perl) вместо этого используют *?.Если вы используете это, сопоставляется как можно меньше символов, поэтому он остановится на следующем ) вместо того, чтобы сопоставить столько содержащихся ) символов, чтобы получить последний в строке:

%s/10\*\*PM_dw2(np.log10(\(.\{-}\))/PM_dw2(\1/g
Регулярные выражения

sed имеют только жадные совпадения;Один из способов обойти эту проблему (в данном конкретном случае) состоит в том, чтобы вместо этого изменить атом . на класс символов , исключающий символ ): [^)]*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...