查找模式并用模式后的所有内容替换 vim

4

我有一个文件,其内容如下:

size is X1 Identifier is Y1
size is X1 Identifier is Y1
size is X1 Identifier is Y1

我想重新排列文件,以便获得
Identifier is Y1 size is X1 
Identifier is Y1 size is X1 
Identifier is Y1 size is X1 

我该如何使用vim查找和替换?或者使用vim的其他功能?

什么是规则?前三列被移动到行末,或者直到标识符之前的所有内容都被移动,以此类推...您可以使用替换命令或正常模式命令(在删除命令前加上数字作为移动单词,移动到结尾,使用粘贴等)。 - Sundeep
4个回答

6
使用捕获组并切换两个组。
%s/\v(.*) (I.*)/\2 \1

4
正如你所说的“或vim中的任何其他功能”,我将通过录制一个宏来提供一种替代方案。个人而言,我喜欢使用宏来完成这样的事情,因为你只需要执行一次想要做的操作,这有助于你思考具体想要做什么,然后只需重复相同的操作即可。
下面的方法可能不是最高效的,但希望它是一种比较直接的方法。
首先,将光标放在第一行的任何位置。
qa(开始在寄存器a中录制宏-您可以将a替换为任何其他字母)
0(移到该行的开头)
接下来,执行任何您想使用的命令来删除行的前半部分,例如:3dw-如果您需要更复杂的规则来识别要移动的行的部分,则可以在此处执行此操作。
$(移到该行的结尾)
aSPACEESCp(在行尾添加一个空格,然后粘贴我们之前删除的文本)
j(向下移动一行,因此我们在完成此运行宏时将进入下一行)
q(停止录制)
完成后,第一行应该处于您想要的状态,并且光标将位于第二行。要从当前位置开始重复上述步骤,请执行以下操作:
@a(或者在第一步中选择的任何字母替换a)。

值得注意的是,如果您在录制宏时改变了主意,只需按下q即可停止录制,并重新开始。 - DaveyDaveDave

2
我不常用vim,但你要找的术语是“正则表达式捕获组”,几乎所有正则表达式实现都支持它。 捕获组可以给出匹配模式的各个部分,并让您根据需要重新组织它们。
这里有一个问题可能包含了你的答案: 类似问题

2

:%s/\(大小为 \w*\) \(标识符为 \w*\)/\2 \1/g 这个命令有效。我假设你标记为X1Y1的部分可以是任何单词,因此使用了\w*


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接