我在一个文件中有一组数据,如下所示:
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
行匹配,因为不是由介绍字符进行的。