Vim как вставить пустую строку перед каждым изменением шаблона в начале строки? - PullRequest
1 голос
/ 02 марта 2012

Допустим, у меня есть список, такой как:

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 ]

4 голосов
/ 03 марта 2012

Для выполнения этой задачи можно использовать одну команду :global вставка пробела после каждой строки, которая не начинается с того же слова, что и сразу следующая строка:

:g/^\(\w\+\).*\n\1\@!./pu_
1 голос
/ 02 марта 2012

Пробудитесь на помощь!

awk 'x != $1 { if(NR > 1)  print ""; x = $1 } {print}' file.txt > save-me.txt

Обзор:

  • x != $1 { ... } запускать блок, когда переменная x не равна первому полю aka $1
  • if(NR > 1) print ""; печать пробела, кроме первой записи.
  • x = $1 установить x равным первому полю, $1
  • {print} - сокращение для текущей записи

Вы можете фильтровать текст из Vim с помощью команды фильтра, например :%!sort. Поэтому для ответа на предложенный вопрос вы можете сделать следующее:

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

Обзор:

  • % является сокращением для диапазона всего файла, или 1,$
  • В примере нет имени файла, потому что строки, представленные диапазоном, передаются через stdin.
  • Вывод заменит текст в диапазоне.
  • Вам нужно будет сбежать от любого ! с \!

См. Ниже для получения дополнительной информации о фильтрации Vim

:h filter
:h :range!
:h :!
1 голос
/ 02 марта 2012
:let x='Foo' | g/^/ let y=split(getline('.'))[0] | if x!=y | s/^/\r/ | let x=y | endif

Для простоты: Вы можете let x='', затем :1d

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...