2

我只是想知道是否有人可以帮助如何使用 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 命令可以执行此操作?

干杯本

4

4 回答 4

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。

重新评论:

有人提到当有多个单词时它会不起作用等等。我在以下方面对其进行了测试:

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:
于 2009-06-24T15:56:55.033 回答
1

天哪,在我登录发布该答案的时间里,您发布了它并且已经得到了评论!

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

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

于 2009-06-24T16:02:02.897 回答
1

试试这个:

%s:\([A-Za-z0-9]\+\)\(\..\+\)--:\1\2.\1--:g
于 2009-06-24T16:06:07.000 回答
0

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

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

根据具体要求(“something1”和“anotherThing1”允许使用哪些字符),这可能更正确,也可能不正确。

要考虑的另一件事:到目前为止发布的所有解决方案都假设每行仅出现一次“--text.someOtherText--”模式。如果不是这种情况,则模式的 (.*) 部分将具有进行调整并且需要 /g 修饰符。

于 2009-06-25T06:59:58.997 回答