我在文件中有一组数据,如下所示:
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]/
但这不仅仅是摆脱新线条,而是影响线条中的其他角色。它正在删除第一个和最后一个字符以及新行。我在这里错过了什么?
答案 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/^[^>]/,
>
.
。但是可以假定为.
,所以请留空。如需更多帮助,请参阅:
:h :j
:h :g
答案 1 :(得分:1)
你需要捕获换行符之前的字母和下一行的第一个字母,只要它不是'>':
%s/\([AOPT]\)\n\([^>]\)/\1\2/g