Vim如何在每一行的开头更改图案之前插入一行空白

  • 本文关键字:一行 空白 插入 Vim 开头 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

我应该如何继续?提前感谢。。。

为了完成此任务,可以使用单个: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 = $1x设置为等于第一个字段$1
  • {print}是打印当前记录的简写

您可以通过像:%!sort这样的筛选器命令从Vim中筛选文本。因此,要回答提出的问题,您可以执行以下操作:

:%!awk 'x != $1 { if(NR > 1) print ""; x = $1 } {print}'

概述:

  • %是整个文件范围的简写,也称为1,$
  • 示例中没有文件名,这是因为范围所代表的行是通过stdin输入的
  • 输出将替换范围中的文本
  • 您必须使用!逃离任何!

有关Vim过滤的更多信息,请参阅以下内容

:h filter
:h :range!
:h :!

最新更新