vim regex: многострочное редактирование и управление положением курсора - PullRequest
1 голос
/ 15 декабря 2011

Текстовый файл отформатирован так:

Section 4 Area B Unit 20
   stuff i don't need...
   stuff i don't need...
   45990 - Title of Project that I want to save
   line of text I need to keep
   line of text I need to keep
   2010-11 this line (starting with 2010) is not needed
   stuff i don't need

Section 589 Area C Unit 1005
   stuff i don't need...
   stuff i don't need...
   45990 - Title of Project that I want to save
   line of text I need to keep
   line of text I need to keep
   2010-11 this line (starting with 2010) is not needed
   stuff i don't need

, и эти разделы повторяются сотнями.Строки "вещи, которые мне не нужны" на самом деле около 30 или около того.Мне нужно сохранить связь между строкой «Раздел ...», строкой «Заголовок ...» и «Текстовой строкой, которую мне нужно сохранить», связанной друг с другом.Поэтому я надеялся сначала разложить текстовый документ вниз (по аналогии) на то, что мне нужно, прежде чем продолжить работу над ним (символьно).Итак, я написал это:

g!/\Section\s\d*\sArea\s\h\sUnit\s\d*\n\|^\s\{3}\zs\d*\s-\_.*\ze2010-11/d

После удаления я получаю строку «Раздел ..» и строку «Заголовок ...», но не следующие строки под строкой «Заголовок ..».Эти последующие строки варьируются от 4 до 8 строк, но строка «2010-11» последовательна и всегда то, чего я больше не хочу.

Вы можете видеть, что я пытался использовать zs и ze, чтобы выбрать то, что я не хочу удалять.Я думаю, что выбор работает, потому что если я изменю команду на «2011-12», то совпадения не будет, и половина (ИЛИ) команды не вернет результат.

Я думаю, что ошибка может быть в позиции курсора (?), Но я не уверен, и мои попытки исправить это не помогли.

Кто-нибудь может увидеть мою ошибку?

Спасибо!

Ответы [ 3 ]

1 голос
/ 16 декабря 2011

Есть много способов сделать это, я уверен. Я думаю, что эта последовательность команд должна работать (игнорируя строки комментариев, которые начинаются с двойной кавычки):

" global delete of line below 'Section' to line before 'Title'
g/^\s*Section/+1;/Title/-1delete
" global delete from date line to line before 'Section'
g/^\s*\d\d\d\d-\d\d/;/^\s*Section/-1delete
" go to top line of buffer
gg
" delete last chunk, from final date to last line
/^\s*\d\d\d\d-\d\d/;$delete 
1 голос
/ 16 декабря 2011

Дай вихрь.

:silent! g/^Section/+ , /^\s\+\d\+ -/- d
:g/^\s\+2010/ , -/\nSection\|\%$/ d
1 голос
/ 16 декабря 2011

:g находит каждую строку, соответствующую началу шаблона, ! отменяет выбор, и к этим строкам применяется команда.

Хотелось бы что-то вроде g/^Section.../normal! j2dd3jd} сделать?

Если нет, вы можете использовать поиск строки заголовка внутри обычного! Возможно, вам придется заключить его в «exec», но может быть гораздо проще написать функцию.

Вам действительно нужно использовать vim? Для меня это похоже на работу для Perl.

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