假设我有一个列表,例如:
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+).*n1@!./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 :!