我们说我有一个列表如:
Foo : 1st chapter
Foo : 2nd chapter
Bar : 1st chapter
Bar : 2nd chapter
Bar : 3rd chapter
Qux : 1st chapter
我想插入一个空白行(当然除了第一行之前)每次一行以不同的模式开头(这里有3个字母,但可能是4位数年份:2010年,2011年,2012年等等...)以便:
Foo : 1st chapter
Foo : 2nd chapter
Bar : 1st chapter
Bar : 2nd chapter
Bar : 3rd chapter
Qux : 1st chapter
我该怎么办?提前谢谢......
答案 0 :(得分:4)
为了完成此任务,可以使用单个:global
命令
在每个不以相同单词开头的行之后插入空格
紧接着的一行:
:g/^\(\w\+\).*\n\1\@!./pu_
答案 1 :(得分:1)
:let x='Foo' | g/^/ let y=split(getline('.'))[0] | if x!=y | s/^/\r/ | let x=y | endif
为简单起见:您可以let x=''
然后:1d
答案 2 :(得分:1)
要求救援!
awk 'x != $1 { if(NR > 1) print ""; x = $1 } {print}' file.txt > save-me.txt
概述:
x != $1 { ... }
在变量x
不等于第一个字段$1
if(NR > 1) print "";
打印除第一条记录外的空白区域。x = $1
设置x
等于第一个字段$1
{print}
是打印当前记录的简写您可以通过像:%!sort
这样的过滤器命令从Vim过滤文本。因此,要回答提出的问题,您可以执行以下操作:
:%!awk 'x \!= $1 { if(NR > 1) print ""; x = $1 } {print}'
概述:
%
是整个文件范围的简写,即1,$
stdin
输入的。!
\!
有关Vim过滤的更多信息,请参阅以下内容
:h filter
:h :range!
:h :!