繁体   English   中英

Vim如何在每行开头的每个样式更改之前插入空白行?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM