vi搜索复制粘贴搜索副本

时间:2009-06-24 15:46:29

标签: search vim copy vi paste

我只是想知道是否有人可以帮助解决如何使用vi进行以下操作。

我有一个文本文件,它可能包含类似

的内容
start of text file:
--something1.something2--
--anotherThing1.something2--
end of text file:

如果我想接受这一行并通过搜索与第一次出现的[A-Za-z0-9]副本相匹配的任何内容进行转换,然后将其附加到缓冲区的第一个出现之前的同一行 - < / p>

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

是否有一个VI命令可以执行此操作?

干杯 本

4 个答案:

答案 0 :(得分: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 :(得分:1)

神圣的废话,在我登录发布该答案的时候,你发布了它并且已经收到了评论!

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

- ab1.cd2..yz99-- - &gt; --ab1.cd2..yz99.ab1 -

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:0)

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

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

根据具体要求(“something1”和“anotherThing1”允许的字符数),这可能会或可能不会更正确。

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