我有一个这样的文件:
Question 1
b) answer b
c) answer c
a) answer a
d) answer d
Question 2
a) answer a
d) answer d
b) answer b
c) answer c
Alls答案未分类。我需要将所有第一个答案(无论是什么字母,只是它们是第一个答案)设置为v)
,其余设置为x)
,因此输出将为:
Question 1
v) answer b
x) answer c
x) answer a
x) answer d
Question 2
v) answer a
x) answer d
x) answer b
x) answer c
是否可以使用单行命令?
答案 0 :(得分:0)
您可以使用以下内容:
:%s/\d\+\_s\zs\l\ze)/v/ | %s/\D\_s\zs\l\ze)/x/
但这仅适用于您的特殊情况。
一点点解释:
%s
替换所有行\d\+
一个或多个号码\_s
空格或行尾\zs
和\ze
比赛的开始和结束\l
小写字符:[a-z]
\D
非数字:[^0-9]
|
可用于分隔命令,因此您可以在一行中提供多个命令。答案 1 :(得分:0)
如果你真的想要一行确定。如果您使用足够的|
将命令链接在一起,则可以将任何内容制作成一个内容。
您可以自行进行迭代并根据您看到的模式数量运行不同的替换命令。
:let i = 0 | g/^[abcd])/if i % 4 == 0 | s//v)/ | else | s//x)/ | endif | let i = i + 1
答案 2 :(得分:0)
如果所有问题的行数相同,则可以执行此操作。
从第一行第一列的光标开始(在正常模式下),您可以录制一个宏(此处为a
),这将为一个块执行此操作:
qajrvj^V}0rx'>)q
更详细:
qa
在注册jrv
向下移动一行并用v j^V}
(键入^ V作为Ctrl-V)可视块阻止选择块的其余行的第一个字符0
确保我们在第0列(如果我们遇到文件的末尾,这很重要)rx
用x '>
转到最后一次视觉选择的结尾)
转到下一句话(下一个问题的开头)q
停止录制宏这假设所有问题都在一行(这很容易改变),我们在宏运行时位于问题行的第一列(这也是一个非常小的变化来概括)和所有答案是一行(这种方法需要改变一点,但概括一下这不会太难)。
现在您可以使用@a
再次运行它(之后,@@
重复上一次运行宏)。如果你想把它变成一个递归宏(它会一直运行,直到其中一个动作,可能是一个动作,失败),你可以用它来递归调用到宏的末尾:
qA@aq
使用资本注册名称意味着附加到该寄存器,而不是覆盖它。如果您执行此操作,并且所有问题都遵循这些限制,则可以通过仅运行一次宏(手动)将此替换应用于整个文件。
如果您想保留它以供以后使用,也可以使用:normal
命令将其转换为函数。如果你这样做,我建议将其分散在几个:normal
命令上,并按照我上面的方式进行评论。