2009-06-24 1 views
2

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

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

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 для этого?

Приветствия Бен

+0

Итак, вы хотите скопировать первое слово после '-' до первого '.' и добавьте '.' и слово, найденное до последнего «-»? – stefanB

ответ

5
:%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

Удалите «c» с конца, если вы не хотите, чтобы вас попросили подтвердить каждую замену. –

+0

Модификатор/g для регулярного выражения не требуется. Ваше регулярное выражение не работает, если на одной строке есть несколько случаев --text.text--. – user55400

+0

Что вы подразумеваете под --text.text-- ... у вас есть пример, который терпит неудачу? – stefanB

1

Святое дерьмо, в то время, которое потребовалось мне, чтобы войти в систему, чтобы оставлять этот ответ, вы вывесили его и уже получил комментарий!

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

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

+0

Я на самом деле протестировал его перед публикацией ... – stefanB

1

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

%s:\([A-Za-z0-9]\+\)\(\..\+\)--:\1\2.\1--:g 
0

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

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

в зависимости от конкретных требований (что разрешено чара cттер для «something1» и «anotherThing1»), это может быть или не быть более правильным.

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

+0

Я действительно тестировал несколько сегментов: «--anotherThing1.something2.anotherThing1.anotherThing1.anotherThing1--», это будет все еще добавляйте первое слово перед последним - – stefanB