vi search copy вставить поисковую копию - PullRequest
2 голосов
/ 24 июня 2009

Мне просто интересно, может ли кто-нибудь помочь с тем, как сделать следующее, используя vi.

У меня есть текстовый файл, и он может содержать что-то вроде

start of text file:
--something1.something2--
--anotherThing1.something2--
end of text file:

Если я хочу взять эту строку и преобразовать ее путем поиска чего-либо, соответствующего первому вхождению [A-Za-z0-9], скопируйте это в буфер, а затем добавьте его в той же строке до первого вхождения -

start of text file:
--something1.something2.something1--
--anotherThing1.something2.anotherThing1--
end of text file:

Есть ли одна команда VI для этого?

Приветствие Ben

Ответы [ 4 ]

5 голосов
/ 24 июня 2009
:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/gc

или без запроса подтверждения для каждой замены:

:%s/--\([a-zA-Z0-9]*\).\(.*\)--/--\1.\2.\1--/g

даст:

--something1.something2.something1--
--anotherThing1.something2.anotherThing1--

от

--something1.something2--
--anotherThing1.something2--

Это если вы хотите скопировать первое слово после '-' до первого '.' и добавить "." и слово, найденное перед последним '-'.

Использование vim.

RE КОММЕНТАРИИ:

Кто-то упомянул, что он не будет работать, когда есть несколько слов и так далее. Я проверил это на следующем:

start of text file:
--something1.something2.something3.something4.something5.something6--
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5--
end of text file:

после заменить на вышеприведенное выражение:

start of text file:
--something1.something2.something3.something4.something5.something6.something1--
--anotherThing1.something2.anotherThing3.anotherThing4.anotherThing5.anotherThing1--
end of text file:
1 голос
/ 24 июня 2009

Попробуйте это:

%s:\([A-Za-z0-9]\+\)\(\..\+\)--:\1\2.\1--:g
1 голос
/ 24 июня 2009

Черт возьми, за то время, которое у меня ушло, чтобы войти, чтобы опубликовать ответ, вы опубликовали его и уже получили комментарий!

%s/--\(\w*\)\.\(.*\)--/--\1.\2.\1--/g

- ab1.cd2..yz99-- -> --ab1.cd2..yz99.ab1 -

0 голосов
/ 25 июня 2009

Опираясь на решение stefanB, но используя отрицательные классы символов и настройку «очень волшебный», я получаю следующую команду замещения:

:%s/\v--([^.]+)\.(.*)--/--\1.\2.\1--/

В зависимости от точных требований (что разрешено использовать для символов «что-то1» и «еще один»), это может быть или не быть более правильным.

Еще одна вещь, которую следует учесть: все решения, опубликованные до сих пор, предполагают, что существует только одно вхождение шаблона "--text.someOtherText-- на строку. Если это не так, часть (. *) шаблон должен быть скорректирован и требуется модификатор / g.

...