У меня есть файл со следующим рисунком:
foo 111
baz
foo 222
baz
foo 333
baz
который должен быть превращен в
foo 111
bar 111
baz
foo 222
bar 222
baz
foo 333
bar 333
baz
Итак, продублируйте все строки, начинающиеся с foo
, и измените только foo
дубликаты, но оставьте остальную часть строки (которая отличается в каждом случае) нетронутой. Как это сделать?
regular-expression
search
LB7979
источник
источник
Ответы:
Ну вот:
Разбивая:
Поскольку
g
команда обновит шаблон поиска, вы можете пропустить шаблон для замены в команде замены. (ссылка:,:h :g
поискsearch pattern
).Старая версия:
Разбивая:
Чтобы вставить
^M
пресс Ctrl+vи enter.Примечание : я изначально придумал «более старую» версию, прежде чем я узнал о
t
команде. Я оставлю это, но я не рекомендую использовать это. Первый чище, более простой.источник
foo
....^M
как я объяснил?t
, а затем я добавил вторую. Я поменяю порядок, вы правы. Как насчет первого из них POSIX?Я делаю подобные вещи все время и просто делаю что-то вроде этого
%s/^foo \(.*\)/foo \1\rbar \1/
(частично потому, что я также выполняю много похожих задач, которые невозможно превратить в нечто умное с помощью функции копирования, и на данный момент\(.*\)
это часть моей мышечной памяти).Я подозреваю, что это не POSIX-совместимый (он не работает на других клонах vi), но использование
^M
( C-VReturn) вместо,\r
кажется, работает на большинстве других клонов vi.источник