如何在其他行的末尾放置一些拉线的行?
之前:
11
1
2
3
10
0.0
0.045
0.09
0
之后:
11
1 0.0
2 0.045
3 0.09
10 0
答案 0 :(得分:3)
要在行尾之前进行块选择,即使对于不匹配的列数,也要首先垂直选择所有行中的第一列,然后按$
。
因此,在您的情况下,将光标移动到0.0
的第一列,按ctrl-v
,将光标向下移动到最后一行,按$
,就可以选择块了。现在,您可以使用d
进行剪切并将其粘贴到第二行。
编辑:由于您将10
放在此处,因此粘贴部分变得更加复杂。我将首先越过最右边一列中不影响其他列的块。因此,转到第二行,在1
之后添加两个空格,然后粘贴该块。结果将如下所示:
11
1 0.0
2 0.045
3 0.09
10 0
现在,您需要删除所有行中重复的空格(如果它们干扰您)。在像这样的简单示例中,您可以通过另一个块选择来实现。在更复杂的示例中,您可以使用搜索/替换模式来完成此操作。
答案 1 :(得分:3)
对于这种特定情况,您还可以使用:g
和:m
对行进行重新排序并加入它们。将光标放在第一行,执行}dd
删除空白行。光标应与0.0
对齐。现在做一个简单的:
:,$g/./2m-1|j
这与:g
一起充当行上的迭代器。 :g
命令选择与特定模式匹配的范围内的行,并以:[range]g{pattern}{command}
的形式在这样的匹配行上运行命令。将其分成更小的部分:
,$
,该范围是.,$
的缩写,表示从当前行到文件末尾。这就是光标位置很重要的原因。/./
匹配包含任何字符的行,实际上是一个占位符,表示匹配每行。2m-1|j
是“ tricky”部分,由两个命令组成:
2m-1
移动命令,格式为[range]m{address}
。将行从 range 移到 address 下面。使用时,意味着将第二行移至地址-1
,该地址本身就是另一段“棘手问题”。 -1
是.-1
的缩写,表示当前行位置(.
)减1。此时,光标向上移动以坐在刚移动的线上。j
连接命令,将当前行连接到下一行,并在其间留有空格。您可以通过运行:2m-1
然后在:j
行开始的每一行中0.0
来逐步模拟发生的情况。同样,这里的:g
就像这些命令的最后4行的迭代器一样。
以(*
代表光标位置)开头:
11
1
2
3
10
* 0.0
0.045
0.09
0
运行:2 move .-1
会将其转换为:
11
2
3
10
* 1
0.0
0.045
0.09
0
然后:join
11
2
3
10
* 1 0.0
0.045
0.09
0
移至下一行并重复。
答案 2 :(得分:2)
@GeorgP。的答案已经概述了进行逐块删除的必要性,以便粘贴不会创建新行,而是将其添加到现有行中。更不用说逐块删除会留下空行,因此还有一个额外的步骤可以消除空行。
我经常需要将注册内容“广播”到某种(字符/行/块)模式,为此我写了UnconditionalPaste plugin。有了它,您可以使用4dd
完全(即按行)删除第二个块,然后在第二个末尾使用插件的gbp
(按逐行粘贴)映射线。就像@GeorgP。的答案一样,这将使最后一行包含100
而不是10 0
,并且有必要使用相同的解决方法来插入额外的填充空间。
但是,我的插件提供了许多其他的粘贴变体,而gBp
粘贴为最小拟合(非矩形)块,带有锯齿状的右边缘。在行末粘贴gBp
时,请在以下行的锯齿状末尾附加。这正是此处所需要的。因此,如果您愿意安装插件,则可以通过4dd2G$gBp
完成整个操作。