删除vim中不需要的新行

时间:2014-02-27 19:40:53

标签: vim

我在文件中有一组数据,如下所示:

1  >1st 
2  APOTPOTOPTOA
3  POTPAOTPOAOP
4  OTAAPAOAPOTA
5  APOTA
6  >2nd 
7  POATPOAOOTPA
8  OOPTPAOPOPPO
9  OOTPPOPOAOPO
10 PT

我希望它看起来像这样:

1 >1st
2 APOTPOTOPTOAPOTPAOTPOAOPOTAAPAOAPOTAAPOTA 
3 >2nd 
4 POATPOAOOTPAOOPTPAOPOPPOOOTPPOPOAOPOPT  

所以在vim中我尝试过:

%s/[POTA]\n[POTA]/

但这不仅仅是摆脱新线条,而是影响线条中的其他角色。它正在删除第一个和最后一个字符以及新行。我在这里错过了什么?

2 个答案:

答案 0 :(得分:4)

简单案例

使用:join :global应该可以解决问题。

:g/^>/+j! 4
  • :g/{pat}/{cmd}在每个匹配模式的行{cmd}上运行{pat}
  • :join将联合起来
  • :join!将在不触及空格的情况下加入。
  • :join需要一个范围我们的范围是下一行+1,可以缩写为+
  • :join可以获取要加入的行数。在这种情况下4

广义案例

对于任意数量的行,请使用范围更复杂的:join命令。

:v/^>/-2/^[^>]/,j!

概述

:join!如果该行未以>开头,或者前一行以>开头,那么当前行与其上方的行。

细节的荣耀

  • :v/{pat}/{cmd}将在 匹配{cmd}
  • 的每一行上运行{pat}
  • :j命令的范围为:-2/^[^>]/,
  • :j!表示加入而不会搞乱空白
  • 范围为-2/^[^>]/,
  • 这将读取当前行上方的第2行,然后查找不以>
  • 开头的下一行
  • 结束范围是当前行.。但是可以假定为.,所以请留空。

如需更多帮助,请参阅:

:h :j
:h :g

答案 1 :(得分:1)

你需要捕获换行符之前的字母和下一行的第一个字母,只要它不是'>':

%s/\([AOPT]\)\n\([^>]\)/\1\2/g