Поскольку вы отметили это с помощью vi и изначально спрашивали о vi, я объясню, почему это не работает в vi для вас , и как это исправить. Вы сказали, что изначально пытались:
%s/ab*/ab001/g
Метод *
работает в поиске, путем сопоставления предыдущего атома 0 или более раз, насколько это возможно. Из : h / *
:
*/star* */\star*
* (use \* when 'magic' is not set)
Matches 0 or more of the preceding atom, as many as possible.
В этом случае предыдущий атом - 'b', поэтому этот поиск будет соответствовать любому из этих:
a
ab
abbb
abbbbbbbbbbbbbbbbbbb
Он также будет соответствовать ab001
, но соответствует только его первой части, поэтому совпадение будет (ab) 001
. Vi видит, что вы искали это, и заменяет его на (ab001) 001
. Решение простое. Вы хотите сопоставить
'ab', за которым следует что-нибудь
. Точка (.
) будет соответствовать любому символу, кроме символа новой строки. Таким образом, если вы ищете
/ab.*/
, он будет соответствовать всему , начинающемуся с 'ab'. Итак, вы хотите:
:%s/ab.*/ab001/g
Если это слишком много совпадений (например, таких слов, как «абсолютно»), вы можете упростить это, чтобы искать только цифры. Например, это будет соответствовать 'ab', за которым следует любое количество цифр:
/ab\d*/
, и это будет соответствовать 'ab', за которым следуют ровно три цифры:
/ab\d\{3}/
Я бы рекомендовал добавить в закладки эту страницу для быстрого Ссылка на vi-regex. Я обнаружил, что это чрезвычайно ценно для устранения неполадок с некоторыми регулярными выражениями.