2009-06-24 308 views
2

我只是想知道是否有人可以帮助与如何使用vi做到以下几点。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命令来执行此操作?

干杯 本

+0

所以你想复制' - '后的第一个单词到第一个''。并追加'。'并在最后的' - '之前找到的单词? – stefanB 2009-06-24 15:50:38

回答

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”。 – 2009-06-24 15:59:16

+0

正则表达式的/ g修饰符不是必需的。如果在一行中有多个--text.text--发生,您的正则表达式不起作用。 – user55400 2009-06-25 06:54:00

+0

你的意思是--text.text-- ...你有没有失败的例子? – stefanB 2009-06-25 07:11:27

1

哇靠,它带我到登录才能发布这个答案的时候,你的贴吧和已有评论!

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

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

1

试试这个:

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

大厦stefanB的解决方案,但使用否定字符类和“非常神奇”的设置,我到达以下替换命令:

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

根据不同的具体要求(什么是允许甜心csters为“something1”和“anotherThing1”)这可能会或可能不会更正确。

还有一件要考虑的事情:到目前为止发布的所有解决方案都假定每行只有一个“--text.someOtherText--模式发生,如果不是这样,则(*。)部分该模式必须进行调整并且需要/ g修饰符。