Vim如何在行开始每次更改模式之前插入一个空行?

时间:2012-03-02 15:42:10

标签: regex vim

我们说我有一个列表如:

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

我该怎么办?提前谢谢......

3 个答案:

答案 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 :!