[英]Vim howto insert a blank line before each change of pattern at the beginning of the lines?
假设我有一个列表,例如:
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
我应该如何进行? 提前致谢...
为了完成此任务,可以使用一个:global
命令,在每行后面都插入一个空格,该行的开头不应与紧随其后的同一单词相同:
:g/^\(\w\+\).*\n\1\@!./pu_
:let x='Foo' | g/^/ let y=split(getline('.'))[0] | if x!=y | s/^/\r/ | let x=y | endif
为简单起见:您可以let x=''
然后:1d
真想救人!
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 :!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.