删除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]/

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

简单案例

:join:global结合使用就可以了。

:g/^>/+j! 4
  • :g/{pat}/{cmd}在每一行匹配模式{pat}上运行{cmd}
  • :join将线路连接在一起
  • :join!将在不接触空白的情况下加入
  • :join取一个范围,我们的范围是下一行+1,可以缩写为+
  • :join可以采用要加入的行数。在这种情况下4

广义情况

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

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

概述

:join!如果当前行不是以>开始,或者如果前一行以>开始。

细节的荣耀

  • :v/{pat}/{cmd}将在与{pat}不匹配的每行上运行{cmd}
  • :j命令的范围为:-2/^[^>]/,
  • :j!表示不干扰空白的联接
  • 范围为-2/^[^>]/,
  • 读取当前行上方的起始2行,然后查找不以>开头的下一行
  • 结束范围为当前行.。但是,可以假定.,因此将其留空

有关更多帮助,请参阅:

:h :j
:h :g

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

%s/([AOPT])n([^>])/12/g

这个正则表达式可以完成以下工作:

:%s/(n>.*n|>.*n)|n/1

必须确保>.*n>1st行匹配,因为不是由介绍字符进行的。

最新更新