4

Я ищу строки в файле, которые соответствуют двухмерному шаблону.

Например, учитывая следующий входной файл:

aaaba
aabaa
aaaba
aaaaa
aaaaa

Я хотел бы использовать шаблон как

ab
ba
ab

соответствовать на верхних 3 строчках. В идеале я хотел бы иметь возможность сделать замену с этим шаблоном, например, заменив его на

ba
ab
ba

1 ответ1

3

Это не может быть сделано только с помощью регулярных выражений. Вам понадобится специальный атом, который работает как группа захвата, но вместо этого захватывает столбец, а затем соответствующий атом для вызова. Лучшее, что вы можете сделать, это сопоставить каждую строку в следующей строке, для вашего примера

/ab\ze.*\n.*ba.*\n.*ab/

При этом сопоставляются не только строки, которые совпадают со строками блока, но и все вхождения, которые содержат текст блока, хотя и не только с одинаковым вертикальным выравниванием, и подсвечивается только совпадение первой строки. Мой плагин SearchHighlighting также предоставляет эту функцию (сопоставленную с {Visual}*).

Если этого недостаточно (вы можете использовать флаг /c для :substitute чтобы вручную проверять и подтверждать каждое совпадение), вы должны создать свою собственную поисковую (и замещающую) инфраструктуру, то есть эквиваленты / , n / N и :s , и сделайте дополнительное утверждение для выравнивания блоков в Vimscript.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .