如何在Vim中附加第三行?

时间:2012-08-01 20:04:38

标签: vim append

我对Vim并不熟悉,但是我正在使用大文本文件(~1G),而我的标准文本编辑并没有削减它。

我的文件目前采用以下格式:

Arbitrary_title_of_sequenceA
SEQ1SEQ1SEQ1SEQ1
SEQ2SEQ2SEQ2SEQ2
Arbitrary_title_of_sequenceB
SEQ1SEQ1SEQ1SEQ1
SEQ2SEQ2SEQ2SEQ2

我需要一种方便的方法将“SEQ2”行添加到“SEQ1”行,如下所示:

Arbitrary_title_of_sequenceA
SEQ1SEQ1SEQ1SEQ1SEQ2SEQ2SEQ2SEQ2
Arbitrary_title_of_sequenceB
SEQ1SEQ1SEQ1SEQ1SEQ2SEQ2SEQ2SEQ2

考虑到这些文件的大小,分别执行每一行并不是一个选择。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

如何开始提供正确的样本?

:g/SEQ1/norm Jx

做你想要的我认为

  • :g/SEQ1:global命令,允许您对包含模式SEQ1的每一行进行操作。请参阅:help :global
  • norm是用于执行普通模式命令的:normal命令,此处在:g/SEQ1匹配的每一行上。请参阅:help :normal

之后出现了正常的命令:

  • J用于将当前行与下面的行结合起来。
  • x用于删除由Vim自动添加的<Space>

答案 1 :(得分:1)

:1,$s/\(.*\n\)\(.*\)\n\(.*\n\)/\1\2\3/

1,$          -> range is all file
s/PAT1/PAT2/ -> substitute PAT1 with PAT2
.*           -> match any character except new line
\n           -> match new line
\(PAT1\)     -> capture/remember the string that matched PAT1
\1,\2,\3     -> refers to the captured string for captures in order

同样使用sed代替vim应该更快:

sed -i 'n;N;s/\n/ /' input_file 

这可以概括为:

Read a line
Read another line and print previous line (n)
Read another line and append it to the previous line (N)
find the first newline and change it to space (s/\n/ /)
print the line (or merged lines)

答案 2 :(得分:0)

我认为romainl的解决方案是最好的如果你有一个可靠的“SEQ1”模式你可以抓住。如果没有,并且您希望逐字加入每个第三行,您可以使用宏轻松地执行此操作:

qqjJxjq

点击G查看文件中有多少行,然后多次重复宏(无论它高于您的需要都没关系)。因此,如果文件是1000行,则可以1000@q。这种解决方案易于记忆并集成到您的正常工作流程中。